gpt4 book ai didi

c++ - 递归 C++ 调用中的内存分配

转载 作者:太空狗 更新时间:2023-10-29 23:24:32 27 4
gpt4 key购买 nike

我在递归 C++ 程序中分配和释放内存时遇到问题。所以在没有使用自动内存管理解决方案的情况下,我想知道是否有人可以帮助我解决我遇到的内存泄漏问题。

下面的代码基本上解释了这个问题(虽然这是一个人为的例子,请纠正我所做的任何错误或简化)。

保存数字值的数字类:

class Number {
public:
Number() { value = 1; };
Number& operator + (const Number& n1) const {
Number result = value + n1.value;
return result;
};
int value;
};

执行递归的两个函数:

Number& recurse(const Number& v1) {
Number* result = new Number();
Number one = Number();
*result = *result + recurse(one);
return *result;
}

int main(...) {
Number answer = Number();
answer = recurse(result);
}

如您所见,递归函数中分配的内存已泄漏,但我不确定根据递归的性质,我可以从哪里释放这些内存?

最佳答案

问题出在这里:

Number& operator + (const Number& n1) const {
Number result = value + n1.value;
return result;
};

您通过引用返回局部变量 (result),这是一个很大的禁忌。局部变量分配在栈上,当函数退出时,变量就没有了。返回对局部变量的引用就是返回指向堆栈的指针,该堆栈现在正被用于其他用途,这会导致很多问题。

您应该做的是按值返回(只需将返回类型从 Number& 更改为 Number)。确保您有合适的复制构造函数,或者编译器自动生成的复制构造函数适合您的需要。这意味着当 operator+ 返回时,它会制作一个拷贝(通常可以通过优化去除),并且由于不涉及指针或引用,您不会获得损坏的返回值。

要修复内存泄漏,您可以使用智能指针,例如 boost::shared_ptr。或者,完全放弃指针和动态内存,只通过 recurse() 的值返回结果。

关于c++ - 递归 C++ 调用中的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/422389/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com