我很确定我没有做错任何事,但我想我还是会问。
我们有:
struct some_struct **array_of_ptrs = calloc (num, sizeof (struct some_struct*));
现在假设我只是将'数组'中的每个指针指向struct some_struct
。现在肯定要释放记忆,我只是这样做:
free (array_of_ptrs);
当然这完全可以接受?我问的原因是因为我在代码中做了类似的事情而且gdb抱怨一个免费的错误。
答案 0 :(得分:2)
这看起来是正确的,只要你意识到你正在获得一个指针数组,而不是一个结构数组,你必须自己分配指针。听起来这就是你正在做的事情。
另请注意,您可以从array_of_ptrs[0]
分配到array_of_ptrs[num-1]
。如果您指定了array_of_ptrs[num]
,则表示您遇到了麻烦。
答案 1 :(得分:0)
是的,你在这里做的看起来是正确的。您正在分配一个num
指针数组。因此,假设一个4字节指针,4 * num
字节,全部初始化为零。如果你然后将它们分配给另一个指针,那么当你free
指针列表时,这不会产生问题。
gdb究竟抱怨什么?它可能会抱怨这些指针指向不一致吗?如果实际的结构本身是动态分配的,则释放指针列表将不会释放它们各自所指向的内容。
答案 2 :(得分:0)
如果你执行
free(array_of_ptrs);那么你正在创建一个内存泄漏因为每个条目在指针数组中有一个指针,所以值得您做一个
free(...);在你首先使用malloc的每个指针上,然后发出最终的
free(array_of_ptrs);。使用指针
处理链表时,这是非常相似的
while (!*array_of_ptrs){ struct *some_ptr_to_struct = *array_of_ptr; free(some_ptr_to_struct); *array_of_ptrs++; } free(array_of_ptrs);
希望这有帮助, 最好的祝福, 汤姆。
答案 3 :(得分:0)
假设所有(struct somestruct *)
指针都指向已经分配的内存,是的,它看起来是正确的。
至于错误,您使用的是什么版本的gcc?我在4.3.3上测试了代码,即使使用-Wall -pedantic
,也无需投诉即可编译。