为什么设置指向NULL的指针会在Valgrind中给出错误/警告?

时间:2012-01-02 15:02:56

标签: c pointers valgrind

我有一个包含一些元素的结构,我在循环中释放了这个结构的内存,大致如下:

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;
然而,Valgrind告诉我一件我不太懂的事情:

==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 个答案:

答案 0 :(得分:6)

释放变量glycan后,您再也无法触及(glycan+i)->desc - 也没有意义

关于感觉部分:想一想,如果你说glycan = NULL,你为什么要关心个别元素的成员?

答案 1 :(得分:2)

问题是您要取消引用free()'指针以将其设置为NULL

现在,试试这个!

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

free(glycan)
glycan = NULL;

将它设置为NULL是有意义的,如果您要重新使用相同的变量malloc()某些内存,并且如果某个模块在不检查{的情况下访问该程序,则不希望程序崩溃{1}}

答案 2 :(得分:1)

在释放聚糖后,您将(glycan+i)->desc设置为NULL。

相关问题