假设我有一个以这种方式定义的结构:
struct myStruct{
data* anotherStruct;
}
假设我在堆上为类型为myStruct
的结构分配内存。指向此结构的指针称为ptr
。然后我打电话给free(ptr)
。这是否释放了仅为myStruct分配的内存,还是释放了为myStruct
和anotherStruct
分配的内存?
如果它只释放为myStruct
分配的内存,这是否会导致内存泄漏,因为没有指向anotherStruct
且永远不会被释放的指针?
答案 0 :(得分:3)
它只释放分配给该地址的内存。即:是最高级别。
这是否释放了仅为myStruct分配的内存,还是释放了为
myStruct
和anotherStruct
分配的内存?
它只释放分配给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
。您可能希望使用malloc
将ptr->anotherStruct
指向一个有用的内存块。然后,您必须在调用free(ptr->anotherStruct)
之前调用free(ptr)
以避免任何内存泄漏。
定义初始化和销毁函数以便自动处理这种“内部(de)分配”非常有用。
答案 3 :(得分:0)
地址是释放内存的关键。每个malloc()
返回的内存是一个单独的密钥。所以上块(即为myStruct类型分配的内存)仅释放并导致内存泄漏。
最佳做法是释放那些内部块,然后释放上部块。如果没有存储在任何地方,你将松开指针地址。
答案 4 :(得分:0)
“free”只能释放最高级别分配的内存。原因很简单,对于结构中的指针成员,您可能会也可能不会从堆中分配内存。如何自由地跟踪所有指针成员的记忆来自何处?
答案 5 :(得分:0)
它只释放分配给该地址的内存,如果你想释放整个链式列表,那么你将不得不遍历它并每次释放一个元素(在你的情况下是一个结构),你将不得不将地址保存到下一个struct释放实际指针然后移动到下一个结构并继续执行直到找到指向null的指针。
答案 6 :(得分:0)
是的,正如大家所说,它将释放仅为结构分配的内存,而不是anotherStruct指向的内存。它肯定会使内存泄漏。程序员有责任释放动态分配的内存。
您可以使用工具“valgrind”来检查内存泄漏。