c++ - 确保正确释放 C++ 对象

标签 c++ oop

我开始自学 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_ptrstd::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/

相关文章:

c++ - 从平面计算网格顶点

Java图形类命题

python - 在不实例化类的情况下跨类传递数据

c++ - 访问 ctor 中的私有(private)类内存

c++ - 为什么方法不起作用?

c++ - 解决 size_t 声明中的歧义

c++ - 使用 FFTW3 和 C++ 评估高斯的傅里叶变换

c++ - 四元数和翻译

c++ - 递归类头包括

ruby - Ruby 中的 OOP 困惑