我如何在 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[])
,其中 A
和 B
是递归依赖的结构,可能很重动态分配。函数 foo
从 A
中创建 B
(基本上是以某种方式将它们复制到 B
中)并且还负责释放原始 [=11= 中的一些深度递归元素]s 在输入数组中。我无法更改该功能。
现在假设我还有一个函数 B bar(B *b1, B*b2)
可以完成一些工作并从 b1
和 b2
中静态分配 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
。
假设我在 C 中实现了一个函数 B foo(const A arr[])
,其中 A
和 B
是递归依赖的结构,可能很重动态分配。函数 foo
从 A
中创建 B
(基本上是以某种方式将它们复制到 B
中)并且还负责释放原始 [=11= 中的一些深度递归元素]s 在输入数组中。我无法更改该功能。
现在假设我还有一个函数 B bar(B *b1, B*b2)
可以完成一些工作并从 b1
和 b2
中静态分配 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
。