Почему при динамическом распределении происходит утечка памяти? - PullRequest
0 голосов
/ 12 мая 2018

У меня есть динамически расширяющаяся реализация фильтра Блума в c на окнах. Ожидается, что размер расширения для каждого раунда составит ~ 4 МБ, но это приведет к выделению 37,7 МБ для каждого случая расширения. Вот коды:

Декларация:

unsigned char **bloom_filter;
const int EXPAND_SIZE=1;
const int COLUMNS=4397164;//~4MB
int bloom_filter_rows=1;

Распределение

bloom_filter=malloc(COLUMNS*sizeof(unsigned char*));
for(int i=0;i<bloom_filter_rows;i++)
    bloom_filter[i]=malloc(COLUMNS*sizeof(unsigned char));//initially bloom_filter is just COLUMNS size

Expansion

int old_size=bloom_filter_rows;
int new_size=old_size+1;
char **temp_bf;
temp_bf=malloc(old_size*COLUMNS*sizeof(unsigned char*));
for(int i=0;i<old_size;i++)
    temp_bf[i]=malloc(bloom_filter_rows*COLUMNS*size0f(unsigned char));
//content is copied to temp_bf using iteration here

// free_old_bf ()

for(int j=0;j<old_size;j++)
    free(bloom_filter[j];
free(bloom_filter);

// расширение

bloom_filter=malloc(new_size*COLUMNS*sizeof(unsigned char*));
for(int i=0;i<new_size;i++)
    bloom_filter[i]=malloc(COLUMNS*sizeof(unsigned char));
//copy back old content here

// free temp_bf

for(int j=0;j<old_size;j++)
    free(temp_bf[j];
free(temp_bf);
...