我在递归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); }
正如你所看到的那样,recurse函数中分配的内存被泄露了,但我不确定在哪里可以根据递归的性质释放这些内存?
问题出在这里:
Number& operator + (const Number& n1) const { Number result = value + n1.value; return result; };
你result
通过引用返回一个局部变量(),这是一个很大的NO-NO.局部变量在堆栈上分配,当函数退出时,变量就消失了.返回对局部变量的引用是将指针返回到现在用于其他东西的堆栈中,这将导致很多不良.
您应该做的是按值返回(只需将返回类型更改Number&
为Number
).确保您有适当的复制构造函数,或者编译器自动生成的复制构造函数适合您的需要.这意味着当operator+
返回时,它会生成一个副本(通常可以通过优化),并且由于没有涉及指针或引用,因此无法获得损坏的返回值.
要修复内存泄漏,可以使用智能指针boost::shared_ptr
.或者,完全沟通指针和动态存储器,只需按值返回结果recurse()
.