Memory leaking in C, malloc inside function -
i trying create 2d array of struct grid_t, , getting memory leak warnings via address sanitiser, , seg fault in conditions.
there may various points in code causing this, thought knowing going wrong here point me in right direction fixing rest.
i new c , memory management, feedback welcome , appreciated!
void creategridarray(atom_t* atom) { atom -> grid = (grid_t**) malloc(width * sizeof(grid_t*)); grid_t *nullgrid = malloc(sizeof(grid_t)); grid_t temp = {null, 0}; *nullgrid = temp; (int = 0; < width; i++) { (atom -> grid)[i] = malloc(height * sizeof(grid_t)); (int j = 0; j < height; j++) { (atom -> grid)[i][j] = *nullgrid; } } //free(nullgrid); <- do now? return; }
firstly, don't cast return malloc(). not required in c, , can obscure serious errors.
second, don't hard-code type malloc() call. example,
atom->grid = (grid_t**) malloc(width * sizeof(grid_t*)); would replaced
atom->grid = malloc(width * sizeof(*(atom->grid))); this ensures memory allocated of required size, regardless of atom->grid pointer to.
to answer question, release memory, need pass every nonnull pointer returned malloc() free(). once.
so, if allocate this
atom->grid = malloc(width * sizeof(*(atom->grid))); grid_t *nullgrid = malloc(sizeof(*nullgrid)); grid_t temp = {null, 0}; *nullgrid = temp; (int = 0; < width; i++) { (atom -> grid)[i] = malloc(height * sizeof(*((atom->grid)[i]))); (int j = 0; j < height; j++) { (atom -> grid)[i][j] = *nullgrid; } the 1 way of deallocating be
for (int = 0; < width; i++) { free((atom -> grid)[i]); } free(atom->grid); free(nullgrid); in case, cannot safely free(atom->grid) before free((atom -> grid)[i]) (unless store of (atom->grid)[i] somewhere else, sort of defeats point). individual (atom->grid)[i] may freed in order (as long each released once).
lastly, check pointers returned malloc(). returns null when fails, , dereferencing null pointer gives undefined behaviour.
Comments
Post a Comment