Почему установка указателя на NULL выдает ошибку / предупреждение в Valgrind? - PullRequest
0 голосов
/ 02 января 2012

У меня есть структура, которая содержит некоторые элементы, я освобождаю память этой структуры в цикле, примерно как:

for (i = 0; i < teller; i++) {
   free((glycan+i)->desc);
}
free(glycan)

Я предполагаю, что указатели все еще указывают на пустые блоки памяти, поэтомуя хотел установить для них значение NULL следующим образом:

for (i = teller; i > 0; i--) {
    (glycan+i)->desc = NULL;
}
glycan = NULL;

Вальгринд, однако, говорит мне кое-что, чего я не очень понимаю:

==11783== Invalid write of size 4
==11783==    at 0x8048F49: main (spectral_matcher.c:122)
==11783==  Address 0x431c070 is 72 bytes inside a block of size 28,000 free'd
==11783==    at 0x4027C02: free (vg_replace_malloc.c:366)
==11783==    by 0x8048F2C: main (spectral_matcher.c:121)

Может кто-нибудь объяснить мне, почему это предупреждение /происходит ошибка, и что я должен сделать по-другому, чтобы не решить ее?

РЕДАКТИРОВАТЬ: Я знаю, что после освобождения я устанавливаю указатель на NULL, освобождение помечает только как свободную память, поэтомууказатель все еще не поврежден (если я не ошибаюсь), который впоследствии я хочу установить в NULL.

Ответы [ 3 ]

6 голосов
/ 02 января 2012

Как только вы освободите переменную glycan, вы больше не можете касаться (glycan+i)->desc - , и это не имеет смысла .

О чувственной части: просто подумайте об этом, если вы скажете glycan = NULL, почему вы заботитесь о членах отдельных элементов?

2 голосов
/ 02 января 2012

Проблема заключалась в том, что вы отменяли ссылку на указатель free() ', чтобы установить его на NULL.

Теперь попробуйте это!

for (i = 0; i < teller; i++) {
    free((glycan+i)->desc);
    (glycan+i)->desc = NULL;
}

free(glycan)
glycan = NULL;

Установка его на NULL имеет смысл, если вы собираетесь повторно использовать ту же переменную для malloc() некоторой памяти и не хотите, чтобы программа вылетала, если какой-либо модуль обращается к ней без проверки NULL

1 голос
/ 02 января 2012

Вы устанавливаете (glycan+i)->desc в NULL после освобождения гликана.

...