0

假设我有一个这样定义的结构:

struct myStruct{
    data* anotherStruct;
}

假设我在堆上为 type 的结构分配内存myStruct。指向此结构的指针称为ptr。然后我打电话free(ptr)。这会释放仅为 myStruct 分配的内存,还是释放为myStructand分配的内存anotherStruct

如果它只释放分配给 的内存myStruct,这是否会导致内存泄漏,因为没有指向anotherStruct并且永远无法释放的指针?

4

7 回答 7

3

它只释放分配给该地址的内存。即:是的,最高级别。

这会释放仅为 myStruct 分配的内存,还是释放为myStructand分配的内存anotherStruct

它只释放分配给myStruct.

如果它只释放分配给 的内存myStruct,这是否会导致内存泄漏,因为没有指向anotherStruct并且永远无法释放的指针?

如果您没有指向anotherStruct那么是的指针,它会泄漏内存。通常的策略是按照分配顺序的相反顺序释放内存。

例如:在您的情况下,您首先分配myStruct然后anotherStruct,因此您应该以完全相反的顺序解除分配,即:anotherStruct首先释放然后 myStruct

于 2012-12-07T04:16:53.827 回答
1

只有最高级别。它不是那么聪明。

于 2012-12-07T04:16:37.767 回答
1

在代码中

struct myStruct *ptr = malloc(sizeof(myStruct));
.
.
.
free(ptr);

没有任何显示影响 ,的anotherStruct成员。您可能希望使用指向有用的内存块。然后,您必须在调用之前调用以避免任何内存泄漏。*ptrptr->anotherStructmallocptr->anotherStructfree(ptr->anotherStruct) free(ptr)

为了自动处理这种“内部(解除)分配”,定义初始化和销毁​​函数非常有用。

于 2012-12-07T04:25:02.790 回答
0

地址是释放内存的关键。每个malloc()返回的内存都是一个单独的键。所以上块(即为 myStruct 类型分配的内存)仅被释放并导致内存泄漏。

最佳做法是释放那些内部块,然后释放上面的块。否则,如果未存储在任何地方,您将丢失指针地址。

于 2012-12-07T04:18:11.410 回答
0

“free”只能释放最高级别分配的内存。简单的原因是,对于结构内的指针成员,您可能会也可能不会从堆中分配内存。free 如何能够跟踪所有指针成员的内存来自哪里?

于 2012-12-07T04:19:22.080 回答
0

它只释放分配给该地址的内存,如果你想释放整个链表,那么你必须循环遍历它并每次释放一个元素(在你的情况下是一个结构),你必须保存地址到下一个结构释放实际指针,然后移动到下一个并继续执行,直到到达指向 null 的指针。

于 2012-12-07T04:20:46.330 回答
0

是的,正如大家所说,它将释放仅为结构分配的内存,而不是 anotherStruct 指向的内存。它肯定会导致内存泄漏。释放动态分配的内存是程序员的责任。

您可以使用工具“valgrind”来检查内存泄漏。

于 2012-12-07T06:12:37.347 回答