free()可以在所有深度或仅在最高级别使用内存吗?

时间:2012-12-07 04:15:12

标签: c memory-management memory-leaks free

假设我有一个以这种方式定义的结构:

struct myStruct{
    data* anotherStruct;
}

假设我在堆上为类型为myStruct的结构分配内存。指向此结构的指针称为ptr。然后我打电话给free(ptr)。这是否释放了仅为myStruct分配的内存,还是释放了为myStructanotherStruct分配的内存?

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

7 个答案:

答案 0 :(得分:3)

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

  

这是否释放了仅为myStruct分配的内存,还是释放了为myStructanotherStruct分配的内存?

它只释放分配给myStruct的内存。

  

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

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

例如:在您的情况下,您首先分配了myStruct然后anotherStruct,因此您应该按照完全相反的顺序解除分配,即:首先是免费anotherStruct,然后是myStruct

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在代码中

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

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

定义初始化和销毁​​函数以便自动处理这种“内部(de)分配”非常有用。

答案 3 :(得分:0)

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

最佳做法是释放那些内部块,然后释放上部块。如果没有存储在任何地方,你将松开指针地址。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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