我如何在 C 中释放一个不知道它是分配在堆栈还是堆上的函数中的数组?

How do I free an array in C inside a function that doesn't know if it is allocated on stack or heap?

假设我在 C 中实现了一个函数 B foo(const A arr[]),其中 AB 是递归依赖的结构,可能很重动态分配。函数 fooA 中创建 B(基本上是以某种方式将它们复制到 B 中)并且还负责释放原始 [=11= 中的一些深度递归元素]s 在输入数组中。我无法更改该功能。

现在假设我还有一个函数 B bar(B *b1, B*b2) 可以完成一些工作并从 b1b2 中静态分配 A 的数组(长度|b1| * |b2| 准确)和 returns foo(A)。到目前为止,一切都运行良好:foo 一直在释放 A 的动态分配元素,没有泄漏,并且由于 arr 没有 malloc'ed 我不必释放 arr.

但是后来我遇到了 bar 的压力测试,由于它在堆栈上创建的数组过大而触发了堆栈溢出(好吧,至少这是我的猜测,因为 Valgrind 报告了大约 10^ 6+ 奇怪的错误,如 "Invalid write of size 8/Address 0xffe8625d0 is on thread 1's stack" 但零泄漏)。所以我改变了我在 bar 中定义 A 数组的方式,从静态到动态。

Valgrind 的奇怪错误消失了,但泄漏已经出现,因为我不知道如何在 bar 调用 bar 时释放 A 内部的这个固有数组 foo 它需要那个数组,而且它负责它所以问题是调用 foo 时数组分配在堆栈或堆上,我不能外包 free'ing 在 foo 之外。这是一个家庭作业 'good C style' 项目,应该避免一些技巧(比如在低级别直接抓取 heap/stacks)。

你不能。只给定一个指针值,没有 portable/reliable 方法来确定它是由 new 分配的,由 malloc() 分配的,或者它是否指向堆上的某些东西(传递的指针实际上可能指向一个堆栈上的对象)。它甚至可以指向数组中的一个元素。函数无法判断。

你必须自己管理你的内存。如果您已动态声明 A,则必须相应地更改 foo