Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upFix memory leaks #163
Fix memory leaks #163
Comments
|
The code gen <- odin({
initial(y[, ]) <- 1
deriv(y[, ]) <- y[i, j] * r[i, j]
dim(y) <- c(2, 3)
dim(r) <- c(2, 3)
r[, ] <- user()
})generates the code: SEXP odin_create(SEXP user) {
odin_internal *internal = (odin_internal*) Calloc(1, odin_internal);
internal->initial_y = NULL;
internal->r = NULL;
internal->dim_r_1 = 2;
internal->dim_r_2 = 3;
internal->dim_y_1 = 2;
internal->dim_y_2 = 3;
internal->dim_r = internal->dim_r_1 * internal->dim_r_2;
internal->dim_y = internal->dim_y_1 * internal->dim_y_2;
Free(internal->initial_y);
internal->initial_y = (double*) Calloc(internal->dim_y, double);
Free(internal->r);
internal->r = (double*) Calloc(internal->dim_r, double);
for (int i = 1; i <= internal->dim_y_1; ++i) {
for (int j = 1; j <= internal->dim_y_2; ++j) {
internal->initial_y[i - 1 + internal->dim_y_1 * (j - 1)] = 1;
}
}
internal->r = NULL;
SEXP ptr = PROTECT(R_MakeExternalPtr(internal, R_NilValue, R_NilValue));
R_RegisterCFinalizer(ptr, odin_finalise);
UNPROTECT(1);
return ptr;
}We don't want to add the lines Free(internal->r);
internal->r = (double*) Calloc(internal->dim_r, double); |
|
This model gen <- odin({
ylag <- delay(y, 3, 2)
initial(y) <- 0.5
deriv(y) <- 0.2 * ylag * 1 / (1 + ylag^10) - 0.1 * y
output(ylag) <- ylag
config(base) <- "delay3"
})generates a finalise/create pair that look like void delay3_finalise(SEXP internal_p) {
delay3_internal *internal = delay3_get_internal(internal_p, 0);
if (internal_p) {
Free(internal);
R_ClearExternalPtr(internal_p);
}
}
SEXP delay3_create(SEXP user) {
delay3_internal *internal = (delay3_internal*) Calloc(1, delay3_internal);
internal->delay_index_ylag = NULL;
internal->delay_state_ylag = NULL;
internal->dim_delay_ylag = 1;
internal->initial_y = 0.5;
Free(internal->delay_index_ylag);
internal->delay_index_ylag = Calloc(internal->dim_delay_ylag, int);
Free(internal->delay_state_ylag);
internal->delay_state_ylag = Calloc(internal->dim_delay_ylag, double);
internal->delay_index_ylag[0] = 0;
SEXP ptr = PROTECT(R_MakeExternalPtr(internal, R_NilValue, R_NilValue));
R_RegisterCFinalizer(ptr, delay3_finalise);
UNPROTECT(1);
return ptr;
}with the |
|
The only one I see now is clearly from R itself:
|
valgrind is reporting leaks