c++亲子类的共享指针
C++ shared pointers of parent-children classes
我有一个场景,在这个场景中,我需要收集集合中某个类型的所有对象,但我还需要它的一些继承类型的集合。例子:
class Particle: public someClass
{
...
public:
static std::vector<std::shared_ptr<Particle>> particleCollection;
}
class ChargedParticle: public Particle
{
...
public:
static std::vector<std::shared_ptr<ChargedParticle>> chargedParticleCollection;
}
然而,当我想销毁这些对象时,我实际上为每个ChargedPartice调用两次析构函数:
Particle::particleCollection.clear(); // Okay
ChargedParticle::chargedParticleCollection.clear(); // Error: particles are already deleted
我怎么能有一个集合的子对象存储在其静态容器和有智能指针指向他们的父类之一?
我希望能够从父类创建对象,并有父类的静态智能指针向量是这些对象的所有者。
我的想法是,我以某种方式为父类智能指针定义一个自定义删除器,仅在对象不是子类集合的元素时调用析构函数。这可能吗?
每个ChargedParticle
同时是Particle
,因此调用Particle::particleCollection.clear();
将足以删除所有已分配的对象。
要在您的情况下使用共享指针,您需要有基类(someClass
或Particle
)从std:: enable_shared_from_this
继承,因此从它创建的共享指针将共享相同的计数器。在你的例子中,这是两个不同的共享指针实例,它们彼此一无所知。
我不认为虚析构函数有任何理由不能满足你的需要。
如果你使用得当,没有问题,类名与你的类名不一样,但我认为这无关紧要:
#include <iostream>
#include <type_traits>
#include <tuple>
#include <vector>
#include <memory>
struct Base
{
Base() { std::cout << " Base::Base()n"; }
// Note: non-virtual destructor is OK here
~Base() { std::cout << " Base::~Base()n"; }
};
struct Derived: public Base
{
Derived() { std::cout << " Derived::Derived()n"; }
~Derived() { std::cout << " Derived::~Derived()n"; }
};
int main() {
std::vector<std::shared_ptr<Base>> base_vector;
std::vector<std::shared_ptr<Derived>> derived_vector;
auto d = std::make_shared<Derived>();
derived_vector.push_back(d);
base_vector.push_back(d);
// 2 function call below does not matter
base_vector.clear();
derived_vector.clear();
}
Demo是从Cpp参考
中的示例展开的你不能用std::shared_ptr
创建自注册类,因为你需要继承std::enable_shared_from_this
,但你不能在构造函数中调用shared_from_this()
,因为:
只允许在先前共享的对象上调用shared_from_this,即在由std::shared_ptr管理的对象上。否则行为是未定义的(直到c++ 17)std::bad_weak_ptr被抛出(由shared_ptr构造函数从默认构造的weak_this抛出)(从c++ 17开始)。
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 嵌套类、继承和C++中的共享指针
- 制作一对共享指针并推送一个向量
- 如何将共享指针用作函数参数
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 尝试通过共享指针使用变量时读取访问冲突
- 如何将元素插入到标准::地图的共享指针中?
- 共享指针生存期
- 初始化可变数据结构中的共享指针向量
- 阻止在返回时复制共享指针