2

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

以下代码由失败编译

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”的指针,那么最好的解决方案是什么?

4

1 回答 1

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 或 boost):

#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 的构造函数和析构函数。

于 2013-07-18T17:56:29.237 回答