当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《递归C++调用中的内存分配》经验,为你挑选了1个好方法。

我在递归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函数中分配的内存被泄露了,但我不确定在哪里可以根据递归的性质释放这些内存?



1> Adam Rosenfi..:

问题出在这里:

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

result通过引用返回一个局部变量(),这是一个很大的NO-NO.局部变量在堆栈上分配,当函数退出时,变量就消失了.返回对局部变量的引用是将指针返回到现在用于其他东西的堆栈中,这将导致很多不良.

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

要修复内存泄漏,可以使用智能指针boost::shared_ptr.或者,完全沟通指针和动态存储器,只需按值返回结果recurse().

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有