创建引用自身的 class 的智能指针成员是 c++ 中优雅的设计模式吗?
Creating a smart pointer member of class referencing itself is a elegant design pattern in c++?
我想知道下面的代码在 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(); }
};
不,发布的代码既无用也不安全。
共有三种情况,其中 none 个结果是肯定的:
- 对象在自动存储中创建
在这种情况下,对象将在超出范围时被销毁。它的析构函数将是 运行 并尝试释放它不拥有的内存,从而导致未定义的行为。
Example
- 对象在动态存储中创建并由调用者
delete
d 获取
在这种情况下,析构函数将在调用者(或调用者创建的某个智能指针)delete
s 对象时被调用。然后,您的析构函数将再次尝试 delete
该对象,从而导致未定义的行为。
Example
- 对象是在动态存储中创建的,调用者
delete
不获取该对象
在这种情况下,对象永远不会被销毁。它的析构函数永远不会被调用,它的存储空间也会被泄露。您的额外 shared_ptr
成员一无所获。
Example
我想知道下面的代码在 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(); }
};
不,发布的代码既无用也不安全。
共有三种情况,其中 none 个结果是肯定的:
- 对象在自动存储中创建
在这种情况下,对象将在超出范围时被销毁。它的析构函数将是 运行 并尝试释放它不拥有的内存,从而导致未定义的行为。
Example
- 对象在动态存储中创建并由调用者
delete
d 获取
在这种情况下,析构函数将在调用者(或调用者创建的某个智能指针)delete
s 对象时被调用。然后,您的析构函数将再次尝试 delete
该对象,从而导致未定义的行为。
Example
- 对象是在动态存储中创建的,调用者
delete
不获取该对象
在这种情况下,对象永远不会被销毁。它的析构函数永远不会被调用,它的存储空间也会被泄露。您的额外 shared_ptr
成员一无所获。
Example