【发布时间】:2014-07-15 08:26:57
【问题描述】:
我在这里阅读了一些关于堆栈溢出的其他类似问题,并修复了我使用 free(); 时遇到的问题
我有一个这种类型的结构数组:
typedef struct _event {
char* desc;
int start;
int end;
} event;
但似乎我只能释放 desc,而如果我尝试将 free 用于两个整数(开始/结束),它不起作用。
阅读其他帖子中的其他答案,我了解到我无法释放我没有 malloc 的东西。关键是:我不需要malloc() 一个整数。但在我的练习中,我真的需要擦除那个数组块。 (我不是指整个数组,只是那个块)。
我不想在这篇文章中放太多代码以免打扰读者,但如果您需要请告诉我!
目前我正在使用:
free(event[i].desc);
在某个if 语句下的for 循环中。
问题是如何 free 也 event[i].start 和 event[i].end ?
提前谢谢你,我很抱歉这个愚蠢的问题,但我想知道是否可以释放整个单元格而不是使用像“0”这样的标记。
附:如果你知道关于free()函数的好文章或教程,可以链接给我吗?
【问题讨论】:
-
但是您不会为
start和end分配内存,是吗?那你为什么要释放它?尝试释放尚未分配的内存可能会导致undefined behavior。此外,start和end成员就像普通变量一样,您不会尝试释放本地int变量吗? -
我们需要明白你所说的“免费”是什么意思:你是要重置
start和end的值还是要将这些变量占用的空间标记为可用,因为你不再需要它了? -
也许混乱来自人们谈论“释放指针”的草率方式。那不准确。你永远不会“释放指针”。相反,您释放了一些 内存,并通过一些指针来引用该内存。
-
“我真的需要擦除那个数组块。”你真的不能。想象一下整数数组。您不能简单地“删除”中间的一个元素。你需要在两个不同的层面上思考。一个是
_event的构造和解构(这是free(desc)很重要的地方)。第二个是你如何组织和管理你的事件——这是你的_events 数组,但不管它是什么类型,你不能简单地从T array[SIZE]中删除一个元素。您组合、混合和混淆了两个抽象级别。 -
没有
malloc,没有free。malloc在heap section中分配内存,而free在heap section中释放内存。在stack section中分配的变量将是freedauto。你可以http://en.wikipedia.org/wiki/C_dynamic_memory_allocation和http://man7.org/linux/man-pages/man3/malloc.3.html寻求帮助。