0

我正在使用模拟框架。生成的每个粒子都有一个指向 UserInfo 对象的指针槽(因此您可以将所需的任何信息附加到粒子)。问题在于,每当粒子被杀死时,框架都会删除此用户信息。由于有数以百万计的粒子,通常具有重复的信息,我只想在信息不同时创建一个新的 UserInfo 对象。当然,问题是每当一个粒子被杀死时,它都会删除它有一个指针指向的 UserInfo 对象(不管同一个对象是否也附加到某个其他粒子。)

当粒子被杀死时,我需要采取哪些步骤来防止粒子删除 UserInfo 对象?我意识到我需要为我的 UserInfo 类做一些引用计数和重载删除。但是,我以前从未重载过 delete,所以我有几个问题:

  1. 如果我有一个类层次结构,例如:

    class VirtualUserInfo;
    class A : public VirtualUserInfo;
    class B : public A
    ...etc
    

    我在A类中重载delete,如果在指向VirtualUserInfo的指针或指向B类的指针上调用delete,它会起作用吗?(非常相似,如何重载 new 才能正常工作?是否需要为每个新的派生类再次重载 new ?)

  2. 使用奇怪重复的模板模式很容易进行引用计数。有没有办法以这种混合风格的方式也包括删除行为?将这种类型的行为应用于我要编写的任何类型的 UserInfo 会很好。

  3. 有没有一些更酷/更好的方法来做我想做的事情?

4

2 回答 2

0

为什么需要crtp??使用可以在新标准或 boost 库中使用 shared_ptr,如果您的编译器不支持 boost 或新标准,您也可以实现自己的引用计数智能指针,只需看看这里: http ://code.google.com /p/tnnlib/source/browse/trunk/%20tnnlib/Utilities/Utilities/SmartPtr/SmartPtr.h

于 2012-02-28T09:51:51.070 回答
0

我不确定你为什么需要一个包装类......你真的不能改变你的粒子类接口吗?指向用户信息的指针部分看起来像这样:

class Particle {
   std::shared_ptr<VirtualUserInfo> mpUserInfo;
public:
   Particle(std::shared_ptr<VirtualUserInfo> UserInfo):
      mpUserInfo(UserInfo)
   {}
};

你尝试自己实现的任何东西都可能只是复制已经可用的东西std::shared_ptr,这最终可能比改变你的界面更多的工作。

于 2015-08-20T16:57:11.807 回答