我有一个关于在 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
但已被释放。
-我有两个指针(一个 inB
和另一个 in C
)都指向同一个地址(of a
),并且当 D 的析构函数删除b
(依次调用delete a
)时,该内存现在设置为已释放。
- 现在当D
' 的析构函数 deletes时c
,c
尝试delete a
自行调用失败,因为a
已经被释放。
我对 C++ 比较陌生,但对编程并不陌生。我查了一下,发现智能指针(如 shared_ptr)可以解决这个问题,但在这种情况下,最佳实践是什么?我应该只创建两个单独的A
对象吗?