【发布时间】:2011-02-26 22:52:14
【问题描述】:
当我运行这段代码时:
#include <stdio.h>
typedef struct _Food
{
char name [128];
} Food;
int
main (int argc, char **argv)
{
Food *food;
food = (Food*) malloc (sizeof (Food));
snprintf (food->name, 128, "%s", "Corn");
free (food);
printf ("%d\n", sizeof *food);
printf ("%s\n", food->name);
}
我还是得到了
128
Corn
虽然我已经释放了食物。为什么是这样?内存真的释放了吗?
【问题讨论】:
-
我个人不同意人们建议在释放后将指针归零是 C 中的一个好习惯。它可能导致粗略的“if(ptr == NULL)”检查哪些掩码错误如果您没有进行归零,则 valgrind 可能 已捕获。但要进行更深入的讨论,请参阅以下问题:stackoverflow.com/questions/1931126/…
-
我现在尝试了valgrind,它没有检测到内存泄漏,但它可以检测到访问释放内存的错误。谢谢你的提示。经过测试,我可以说在这个例子中: - 内存被释放 - 当我尝试访问释放的内存时没有错误或警告
-
您的示例中没有内存泄漏。你是说如果你删除 free 语句就不会收到泄漏通知吗?如果是这样,请查看 --leak-check 的各种设置,因为有许多不同的情况,并且有些程序故意不通过并在程序退出时释放所有内容(作为增加关机速度,因为无论如何操作系统都会扔掉进程内存):valgrind.org/docs/manual/mc-manual.html#mc-manual.leaks
-
我想知道是否释放了内存,因为一切就像我从未释放过它一样。现在使用 valgrind,我使用选项“--tool=memcheck --leak-check=yes”确认没有泄漏。唯一让我困扰的是,在 C 中访问释放的数据没有显示错误或警告。