【发布时间】:2013-11-05 22:31:38
【问题描述】:
我有一个关于在 C++ 中正确删除/释放内存的问题。
假设我有以下...(假设 A、B、C、D 是类。B 和 C 有实例变量 A* a。D 有两个实例变量,B* b 和 C* c)
A* a = new A();
B* b = new B(a);
C* c = new C(a);
D* d = new D(b, c);
B 和 C 的析构函数:
B::~B() { delete a; }
C::~C() { delete a; }
D 的析构函数:
D::~D() { delete b; delete c; }
现在当我打电话时
delete d;
我收到“访问冲突读取位置 0xfeeefeee”(我在 Visual Studio 2010 中)。我想这是因为
-D 的析构函数试图在 a 已被释放时两次“删除”相同的内存 (a)。
-我有两个指针(一个在B,另一个在C)都指向同一个地址(a),当D的析构函数删除b时(又调用delete a ),此内存现在设置为已释放。
-现在,当D 的析构函数删除c 时,c 尝试自行调用delete a,但由于a 已被释放而失败。
我对 C++ 比较陌生,但对编程并不陌生。我查了一下,发现智能指针(如 shared_ptr)可以解决这个问题,但在这种情况下,最佳实践是什么?我应该只创建两个单独的A 对象吗?
【问题讨论】:
-
不要使用指针。您很可能不需要它们,即使您需要它们,它们也是一个非常高级的主题,极难理解和正确使用,所以暂时不要这样做。
标签: c++ memory constructor destructor