Ошибка при освобождении памяти в C, visual studio - PullRequest
0 голосов
/ 15 марта 2019

Я работаю над проектом, в котором я использовал Calloc, и пытаюсь освободить память в конце моей основной функции {}. Однако после того, как программа завершает работу, и я нажимаю на остановку, я получаю следующее сообщение: «proj.exe вызвал точку останова». на этот набор кодов:

while (freeSpace != NULL) { free(freeSpace++); }

Вот мои коды для выделения памяти:

scanf("%d", &SEG);
  BLOCKS = 128 / SEG;

for (int k = 0; k < BLOCKS; k++)
{
    memory = (int *)calloc(BLOCKS, sizeof(int));
    // handle memory allocation failure

}


for (int i = 0; i < BLOCKS; i++)
{

    memory[i] = (int *)calloc(SEG, sizeof(int));
    // handle memory allocation failure

}

for (int l = 0; l < BLOCKS+5; l++)
{
    //freeSpace = (int*)malloc(l * sizeof(int));
    freeSpace = (int *)calloc( BLOCKS + 5, sizeof(int));
    // handle memory allocation failure

}


for (int o = 0; o < BLOCKS; o++)
{
    memorySpace = (int *)calloc(BLOCKS, sizeof(int));
    // handle memory allocation failure

}

`

Это часть, где я освобождаю свою память:

while (freeSpace != NULL) { free(freeSpace++); }

Может кто-нибудь, пожалуйста, помогите мне?

Ответы [ 3 ]

2 голосов
/ 15 марта 2019

Я думаю, вы неправильно понимаете, как работают указатели при распределении массивов. В самом первом цикле обнаружена утечка памяти, потому что вы меняете то, на что, как я полагаю, указывает указатель «память».

Выделение массива в C было бы как ниже.

int *bigspace; bigspace = malloc(20 * sizeof(int));

Здесь мы сделали указатель "bigspace", указывающий на новый кусок памяти, в 20 раз превышающий размер целого числа, которое является массивом. Если вы сделали что-то, как показано ниже ..

int *bigspace; bigspace = malloc(20 * sizeof(int)); bigspace = malloc(20 * sizeof(int));

Это не было бы Буэно. Сначала мы делаем указатель «bigspace» указателем на кусок памяти (массив целых чисел), а затем мы меняем то, на что указывает «bigspace», заставляя его указывать на новый кусок памяти. Это означает, что у вашей первой порции памяти больше нет указателя на нее, и эта память просочилась!

2 голосов
/ 15 марта 2019

Трудно решить вашу проблему, потому что кажется, что это только часть вашего кода или это прототип? Следующий код основан только на некотором «догадке»:

int main()
{
scanf("%d", &SEG);
BLOCKS = 128 / SEG;

int* memory = (int *)calloc(BLOCKS+1, sizeof(int*));    // the last is a 'NULL' pointer
memset(memory, 0, sizeof(int*)*BLOCKS+1);

for (int i = 0; i < BLOCKS; i++)
{
    memory[i] = (int *)calloc(SEG, sizeof(int));
    // handle memory allocation failure

}

while (memory != NULL) {
        free(memory++);
    }

}
1 голос
/ 15 марта 2019

Я думаю, что проблема в том, что значение freeSpace ++ является мусором в конце вашей выделенной памяти. Свободный указатель мусора вызывает проблему.

...