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

时间:2017-05-11 22:00:28

标签: c malloc free

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

现在假设我还有一个函数A可以完成一些工作并静态分配B bar(B *b1, B*b2)A b1的数组(长度为{确切地说是{1}}并返回b2。到目前为止,一切运作良好:|b1| * |b2|已释放动态分配的foo(A)元素,没有泄漏,而foo没有malloc'ed我没有释放{{1 }}

但是后来我遇到了A的压力测试,由于它在堆栈上创建的数组过大而导致堆栈溢出(好吧,至少这是我的猜测,因为Valgrind报告了10 ^ 6 +奇怪的错误,如“无效写入大小8 /地址0xffe8625d0在线程1的堆栈上”,但零泄漏)。所以我改变了将arr arr数组从静态变为动态的方式。

Valgrind的奇怪错误消失了,但是泄漏已经出现,因为我不知道如何将bar内部的A内部数组释放为bar调用A需要该数组,而且它负责它所以问题是有bar调用堆栈或堆上分配的数组,我不能外包bar之外的自由。这是一个功课“好的C风格”项目和hacky技巧(就像一些直接抓住低水平的堆/堆栈)应该避免。

1 个答案:

答案 0 :(得分:3)

你不能。只给出一个指针值,没有可移植/可靠的方法来确定它是否由new malloc()分配,或者它是否指向堆上的某些东西(传递的指针实际上可能指向一个对象)堆)。它甚至可能指向数组中的元素。这个功能无法说明。

你必须自己管理你的记忆。如果您已动态声明A,那么您必须相应地更改foo