realloc() 是否释放旧内存(当旧内存可能是指向其他内存的指针时)?

Does realloc() free old memory (when old memory might be pointers to other memory)?

假设我有一个指向结构 s1 的数组(在堆上)的指针 p1,其中每个结构 s1 也有一个指向另一个结构 s2(在堆上)的指针。如果我在 p1 上调用 realloc() 来调整它的大小,是否会释放由预重新分配数组的结构持有的旧内存(堆上的 s2s)?

我很确定这个问题的答案是否定的,因为文档指出 if the area pointed to was moved, a free(ptr) is done 这意味着它最多只能释放一层深度。那是对的吗?如果是这样,最好的解决方案是手动 malloc 一个新数组,遍历旧数组,将值复制到新的更大的数组,并在其中释放结构吗?

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

您建议的替代解决方案是 realloc 在幕后所做的事情(假设我们仍在谈论扩大数组而不是其他一些结构操作),重新实现一个东西通常是个坏主意一个标准库,除非你有充分的理由(而且你似乎没有)。

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

如果你正在扩大数组,你不需要对它指向的数组做任何事情。它们的内存是原封不动的,指针会从旧内存复制到realloc()分配的新内存。

如果要缩小数组,则需要确保首先释放超出结果末尾的元素所指向的任何数组,以避免内存泄漏。

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

realloc 将使用现有指针,或者如果旧指针不能就地收缩或扩展,则分配一个新指针。如果分配了新指针,则复制旧内存中适合新位置的内容。

在你的例子中,如果 realloc 缩小了内存块,那么新块中的所有 s1 指针都是有效的,但是超出新内存块的 s1 指针会导致内存泄漏,因为 s1 指针和s2 指针被释放。为避免内存泄漏,您应该在调用 realloc 之前释放它们指向的内存。

使用 realloc 需要注意的另一件事是,如果它 returns null,那么旧的内存指针仍然有效,因此您应该保留它的副本并在失败时重新使用或释放​​它。