为什么动态分配对象无法释放?

时间:2013-07-18 17:54:32

标签: c++

我知道这应该是一个微不足道的问题,但需要找出原因。

以下编译失败的代码

a.out(93143) malloc: *** error for object 0x7fff5af8293f: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

代码:

#include <iostream>

using namespace std;

class A
{
};

class B
{
    private:
        A a;
    public:
        B(){a=*new A();}
        ~B(){delete &a;}
};

int main()
{
    B b;
}

根据即时评论,我意识到“new”中动态分配的对象在分配给“a”后立即失去了它的所有者。现在如果我想要一个对象而不是指向“A”的指针,那么最佳解决方案是什么?

1 个答案:

答案 0 :(得分:12)

因为你的成员变量不是指针。您没有存储动态分配的对象,而是将其副本分配给A a;并泄漏动态分配的对象。

将B类改为:

class B
{
    private:
        A* a;
    public:
        B(){a= new A();}
        ~B(){delete a;}
};

或更好

class B
{
    private:
        A a;
    public:
        B() {}
        ~B(){}
};

如果你真的需要一个动态分配的对象,我想用智能指针提出这个最终的解决方案(你需要C ++ 11或者为此加速):

#include <memory>
#include <iostream>

class A
{
public:
    A() { std::cout << "Hi" << std::endl; }
    ~A() { std::cout << "Bye" << std::endl; }
};

class B
{
public:
    B(): a(new A()) {};
    //~B() {} <-- destructor is no longer needed, the unique_ptr will delete the object for us
private:
    std::unique_ptr<A> a;
};

int main(int argc, char* argv[])
{
    B b;
}

您可以看到A的构造函数和析构函数名为here