【发布时间】:2016-11-05 10:59:49
【问题描述】:
我有一个场景,我需要在一个集合中收集一个类型的所有对象,但我还需要一个它的一些继承类型的集合。示例:
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
我怎样才能将子对象的集合存储在其静态容器中,并让其父类之一指向它们的智能指针?
我也希望能够从父类创建对象,并让父类的静态智能指针向量成为这些对象的所有者。
我的想法是,当对象不是子类集合的元素时,我以某种方式为仅调用析构函数的父类智能指针定义了一个自定义删除器。这可能吗?
【问题讨论】:
-
为什么要用静态成员来存储这个粒子?
-
正确使用
shared_ptr时,不应发生双重析构函数调用。您应该显示更多代码,可能是 mcve:stackoverflow.com/help/mcve -
@АлександрЛысенко 简单的用例:我想计算带电粒子上的力,由于静电相互作用。为此,我需要知道所有其他带电粒子的位置。
-
也许你应该只在基类中保留粒子?不创建可能的重复项?
-
从 cppreference,只允许在以前共享的对象上调用 shared_from_this,即在由 std::shared_ptr 管理的对象上。否则行为未定义(C++17 前)std::bad_weak_ptr 被抛出(由默认构造的weak_this 中的shared_ptr 构造函数)(C++17 起)。
标签: c++ destructor smart-pointers ownership-semantics