Skip to content

Commit 8d881ee

Browse files
committed
nix_api_expr: ensure destructors are called for builder/state
I found this because of a test failure on cygwin in nix_api_expr_test.nix_eval_state_lookup_path: 'std::filesystem::__cxx11::filesystem_error' what(): filesystem error: cannot remove all: Device or resource busy [...] [.../my_state/db/db.sqlite] LocalState was never getting destroyed due to a reference leak. These _free functions use an 'operator delete' which doesn't call the destructor for the type. Fixes: 309d558
1 parent 1f2a994 commit 8d881ee

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

src/libexpr-c/nix_api_expr.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ nix_eval_state_builder * nix_eval_state_builder_new(nix_c_context * context, Sto
137137

138138
void nix_eval_state_builder_free(nix_eval_state_builder * builder)
139139
{
140+
if (builder)
141+
builder->~nix_eval_state_builder();
140142
operator delete(builder, static_cast<std::align_val_t>(alignof(nix_eval_state_builder)));
141143
}
142144

@@ -203,6 +205,8 @@ EvalState * nix_state_create(nix_c_context * context, const char ** lookupPath_c
203205

204206
void nix_state_free(EvalState * state)
205207
{
208+
if (state)
209+
state->~EvalState();
206210
operator delete(state, static_cast<std::align_val_t>(alignof(EvalState)));
207211
}
208212

0 commit comments

Comments
 (0)