Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 仅删除最后一个引用CRTP_C++_Operator Overloading_Delete Operator_Crtp_Reference Counting - Fatal编程技术网

C++ 仅删除最后一个引用CRTP

C++ 仅删除最后一个引用CRTP,c++,operator-overloading,delete-operator,crtp,reference-counting,C++,Operator Overloading,Delete Operator,Crtp,Reference Counting,我正在使用一个模拟框架。生成的每个粒子都有一个指向UserInfo对象的指针槽(因此您可以将所需的任何信息附加到粒子)。问题是,只要粒子被杀死,框架就会删除这些用户信息。由于有数百万个粒子,通常具有重复的信息,因此我只想在信息不同时创建一个新的UserInfo对象。当然,问题是每当一个粒子被杀死时,它都会删除它有一个指针指向的UserInfo对象(不管该对象是否也附加到其他粒子上) 当粒子被杀死时,我需要采取哪些步骤来防止粒子删除UserInfo对象?我意识到我需要对我的UserInfo类进行一

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

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

  • 如果我有一个类层次结构,如:

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

  • 使用奇怪的循环模板模式很容易进行引用计数。有没有一种方法可以以这种mixin风格的方式包含delete行为?将这种类型的行为应用于我要编写的任何类型的用户信息都是很好的

  • 有没有更酷/更好的方法来做我想做的事


  • 为什么您需要crtp??Use可以在新标准或boost库中使用共享的_ptr,也可以实现自己的引用计数智能指针如果编译器不支持boost或新标准,只需查看以下内容:

    我不知道为什么需要一个包装器类……你真的能不更改粒子类接口吗?指向userinfo部分的指针如下所示:

    class Particle {
       std::shared_ptr<VirtualUserInfo> mpUserInfo;
    public:
       Particle(std::shared_ptr<VirtualUserInfo> UserInfo):
          mpUserInfo(UserInfo)
       {}
    };
    
    类粒子{
    std::共享用户信息;
    公众:
    粒子(标准::共享用户信息):
    mpUserInfo(UserInfo)
    {}
    };
    

    您尝试自行实现的任何内容都可能只是复制了
    std::shared\u ptr
    中已有的内容,这可能会比更改接口更麻烦。

    看起来您需要的是一个智能指针。C++有了这个代码的代码> STD::SyrdYPPTR <代码>。我可以使用智能指针吗?我会使用正则指针吗?因为我需要使用类似于someFrameworkClass::setUserInfo(VirtualUserInfo*myUserInfo)的方法;是的,但是请注意,有不同类型的智能指针。请看此处了解详细信息:要从智能指针中获取原始指针,必须使用
    get
    等方法。不,不能将智能指针直接传递给需要原始指针的框架。但是,您可以在您的
    UserInfo
    中放置一个
    shared\u ptr
    ,它指向真实的数据结构。谢谢,这比我要尝试的要简单得多。你应该加上这个作为答案!