【发布时间】:2012-02-23 04:39:50
【问题描述】:
我正在使用模拟框架。生成的每个粒子都有一个指向 UserInfo 对象的指针槽(因此您可以将所需的任何信息附加到粒子)。问题在于,每当粒子被杀死时,框架都会删除此用户信息。由于有数以百万计的粒子,通常具有重复的信息,我只想在信息不同时创建一个新的 UserInfo 对象。当然,问题是每当一个粒子被杀死时,它都会删除它有一个指针指向的 UserInfo 对象(不管同一个对象是否也附加到其他粒子。)
当粒子被杀死时,我需要采取哪些步骤来防止粒子删除 UserInfo 对象?我意识到我需要为我的 UserInfo 类做一些引用计数和重载删除。但是,我之前从未重载过 delete,所以我有几个问题:
-
如果我有这样的类层次结构:
class VirtualUserInfo; class A : public VirtualUserInfo; class B : public A ...etc并且我在 A 类中重载 delete,如果在指向 VirtualUserInfo 的指针或指向 B 类的指针上调用 delete,它会起作用吗? (非常类似,如何重载 new 才能正常工作?是否需要为每个新的派生类再次重载 new ?)
使用奇怪重复的模板模式很容易进行引用计数。有没有办法以这种混合风格的方式也包括删除行为?将这种类型的行为应用于我要编写的任何类型的 UserInfo 会很好。
有没有更酷/更好的方法来做我想做的事?
【问题讨论】:
-
看起来你需要的是一个智能指针。 C++ 有
std::shared_ptr用于此目的。 -
我可以在任何可以使用常规指针的地方使用智能指针吗?因为我需要使用类似 someFrameworkClass::setUserInfo(VirtualUserInfo* myUserInfo); 的方法
-
是的,但请注意有不同类型的智能指针。在这里查看详细信息:stackoverflow.com/questions/106508/… 要从智能指针中获取原始指针,您必须使用
get之类的方法。 -
不,您不能将智能指针直接传递给需要原始指针的框架。但是,您可以在您的
UserInfo中放置一个shared_ptr,它指向真正的数据结构。 -
谢谢,这比我尝试做的要容易得多。您应该将其添加为答案!
标签: c++ operator-overloading delete-operator crtp reference-counting