Dan*_*Dan 2 c++ memory recursion memory-leaks
我在递归C++程序中分配和释放内存时遇到问题.因此,如果不使用自动内存管理解决方案,我想知道是否有人可以帮我解决我遇到的内存泄漏问题.
以下代码基本上解释了问题(尽管这是一个人为的例子,请纠正我所犯的任何错误或简化).
一个数字类,用于保存数字的值:
class Number {
public:
Number() { value = 1; };
Number& operator + (const Number& n1) const {
Number result = value + n1.value;
return result;
};
int value;
};
Run Code Online (Sandbox Code Playgroud)
执行递归的两个函数:
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);
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,recurse函数中分配的内存被泄露了,但我不确定在哪里可以根据递归的性质释放这些内存?
Ada*_*eld 12
问题出在这里:
Number& operator + (const Number& n1) const {
Number result = value + n1.value;
return result;
};
Run Code Online (Sandbox Code Playgroud)
你result通过引用返回一个局部变量(),这是一个很大的NO-NO.局部变量在堆栈上分配,当函数退出时,变量就消失了.返回对局部变量的引用是将指针返回到现在用于其他东西的堆栈中,这将导致很多不良.
您应该做的是按值返回(只需将返回类型更改Number&为Number).确保您有适当的复制构造函数,或者编译器自动生成的复制构造函数适合您的需要.这意味着当operator+返回时,它会生成一个副本(通常可以通过优化),并且由于没有涉及指针或引用,因此无法获得损坏的返回值.
要修复内存泄漏,可以使用智能指针boost::shared_ptr.或者,完全沟通指针和动态存储器,只需按值返回结果recurse().