我开始自学 C++,如何在没有垃圾收集器的情况下处理对象让我有些困惑。这是我正在尝试做的一个简单案例:
A* a;
B b = new B(a); // Note that B is a derived class of A
a = &b;
while (a != NULL)
{
(*a).run();
}
这一切都如我所料。我遇到问题的地方是在 B 的 run() 方法中,我想做类似的事情:
C c = new C(a); // a is the same pointer as above, that has been stored
// and C another derived class from A
a = &c;
然后让 run() 退出。然后,第一个 block 中的 while 循环将调用新对象上的 run()。我的问题是,如何确保原始 b 中的内存已正确解除分配?
最佳答案
在这种情况下,您可以使用 std::shared_ptr
。如果两个类的成员需要指向同一个对象,那么你可以让它们都成为shared_ptr
。你通常会这样做,但是如果在这样做时,如果你要创建循环依赖,那么要打破这种循环依赖,你需要 std::weak_ptr
。
这里是 std::shared_ptr
和 std::weak_ptr
的例子。
错误代码(循环依赖):
struct B;
struct A
{
std::shared_ptr<B> bp;
}
struct B
{
std::shared_ptr<A> ba; //this creates a cyclic dependency.
}
正确代码(非循环):
struct B;
struct A
{
std::shared_ptr<B> bp;
}
struct B
{
std::weak_ptr<A> ba; //break cyclic dependency with std::weak_ptr
}
关于c++ - 确保正确释放 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14176686/