我知道这应该是一个微不足道的问题,但需要找出原因。
以下编译失败的代码
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”的指针,那么最佳解决方案是什么?
答案 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。