假设我在C中实现了一个函数B foo(const A arr[])
,其中A
和B
是递归相关的结构,可能是动态分配的。函数foo
从B
中创建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技巧(就像一些直接抓住低水平的堆/堆栈)应该避免。
答案 0 :(得分:3)
你不能。只给出一个指针值,没有可移植/可靠的方法来确定它是否由new malloc()
分配,或者它是否指向堆上的某些东西(传递的指针实际上可能指向一个对象)堆)。它甚至可能指向数组中的元素。这个功能无法说明。
你必须自己管理你的记忆。如果您已动态声明A
,那么您必须相应地更改foo
。