2016-08-30 43 views
1

假设我有一个指向结构s1的数组(在堆上)的指针p1,其中每个结构s1也有一个指向另一个结构s2(在堆上)的指针。如果我在p1上调用realloc()来调整它的大小,那么将释放pre-realloced数组的结构中的旧内存(堆中的s2)?realloc()释放旧内存(旧内存可能是指向其他内存的指针)?

我相当肯定的答案,这个问题是没有,因为文档指出if the area pointed to was moved, a free(ptr) is done这意味着它只能腾出一个级别深度。那是对的吗?如果是这样,最好的解决方案是手动malloc一个新的数组,迭代旧的数组,将值复制到新的更大的数组,并释放结构时,它?

+2

'free()'不知道它指向的指针是什么类型的对象。因此,它*无法自动递归地在结构中free()'指针。 – EOF

+0

你的问题有点令人费解。如果你想让块越大,为什么你需要释放除小块之外的任何东西?这个问题是有道理的,如果你想让这个块更小。 –

+0

@DavidSchwartz我已修复措辞来调整大小。我最初写的是放大的,因为我认为可能有些情况下,将旧元素复制到新的地方不会释放旧元素。但是,现在回想起来,我认为情况并非如此? – gowrath

回答

1

realloc()只有重新分配你给它顶级阵列。由于EOF在评论中提到,它不知道数组的内容是指针,所以它不能对这些元素做任何事情。

如果你正在扩大数组,你不需要用它指向数组做任何事情。它们的内存不变,指针将从旧内存复制到由realloc()分配的新内存。

如果你正在萎缩数组,你需要确保你先释放任何由是超越了结果的末尾元素被指出的阵列,以避免内存泄漏。

2

不,realloc可以免费1级,但不会更多。它不会释放结构中的指针。我说它可以做免费的,因为如果数组可以增长而不被移动,它就会在同一个地方增长。

你提出的另一种解决方案是realloc在幕后做的事情(假设我们仍然在讨论扩大数组而不是其他一些结构操作),并且通常从一个事件中重新实现一个东西通常是一个坏主意除非你有一个很好的理由(你似乎没有),否则就是标准库。

1

答案肯定不是。 realloc的工作原理如下:

的realloc要么使用现有的指针或分配一个新的指针,如果旧的不能被压缩或地方扩大。如果分配了一个新的指针,那么旧的内存的内容就会被复制到新的位置。在你的情况下,如果realloc缩小内存块,那么新块中的所有s1指针都是有效的,但s1指针超出新块内存将导致内存泄漏,因为s1指针和s2指针被释放。为了避免内存泄漏,你应该释放它们指向的内存,然后调用realloc。

另一件事要注意与realloc的是,如果返回null,则旧的内存指针仍然有效,所以你应该保持它,要么重用或释放它失败的副本。

相关问题