0

我开始自学 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() 退出。然后,第一个块中的 while 循环将调用新对象上的 run()。我的问题是,如何确保正确释放原始 b 的内存?

4

2 回答 2

1

每当您面临动态内存分配和重要的所有权语义时,智能指针通常是确保正确性的好方法。

例如,参见std::shared_ptr

于 2013-01-05T21:44:29.750 回答
1

你可以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
}
于 2013-01-05T21:45:34.677 回答