创建引用自身的类的智能指针成员是c ++中一种优雅的设计模式吗?

时间:2019-01-31 19:18:01

标签: c++ design-patterns smart-pointers

我想知道以下代码在C ++中是否是一个好的模式?

完全没有问题。该代码有效。但是我想知道这是否会导致某种问题。

#include <iostream>
#include <memory>

template <typename T>
class Class {
    public:
        std::shared_ptr<Class> shared_ptr;

        Class() : shared_ptr(this) {}
        ~Class() { shared_ptr.reset(); }
};

1 个答案:

答案 0 :(得分:7)

不,发布的代码既无用也不安全。

存在三种情况,但都没有一个积极的结果:

  1. 对象是在自动存储中创建的

在这种情况下,对象超出范围将被销毁。它的析构函数将运行并尝试释放它不拥有的内存,从而导致未定义的行为。
Example

  1. 该对象是在动态存储中创建的,并由调用者delete获得

在这种情况下,当调用者(或由调用者创建的某些智能指针)delete成为对象时,将调用析构函数。然后,您的析构函数将尝试再次delete该对象,从而导致未定义的行为。
Example

  1. 该对象是在动态存储中创建的,调用者不会delete得到它

在这种情况下,该对象将永远不会被销毁。它的析构函数将永远不会被调用,并且其存储将被泄漏。您额外的shared_ptr成员一无所获。
Example