C++ 如何将std::shared_ptr添加到多个STL容器?

C++ 如何将std::shared_ptr添加到多个STL容器?,c++,c++11,stl,smart-pointers,C++,C++11,Stl,Smart Pointers,将共享指针传递到不同对象中的stl容器的正确方法是什么,这样就不会过早破坏对象 我有多个系统,其中包含std::queue: class System { typedef std::shared_ptr<Event> EventPtr; protected: std::queue<EventPtr> mEventQueue; static SystemManager * sSystemManager; //this holds all th

将共享指针传递到不同对象中的stl容器的正确方法是什么,这样就不会过早破坏对象

我有多个系统,其中包含std::queue:

class System {
    typedef std::shared_ptr<Event> EventPtr;
protected:
    std::queue<EventPtr> mEventQueue;

    static SystemManager * sSystemManager;
   //this holds all the systems in the application

public:
    System();
    ~System();

    void addEventToQueue(EventPtr event) {
        mEventQueue.push(event);
    }

    void callEventQueue() {
        while(!mEventQueue.empty()) {
           acceptEvent(mEventQueue.front().get());
           mEventQueue.pop();
         }
    }

    void acceptEvent(Event * event);

public:
    static void sendEvent(EventPtr &event) {
        for(auto system : sSystemManager->getSystems()) {
               system->addEventToQueue(event);
        }
    }
};
类系统{
typedef std::shared_ptr EventPtr;
受保护的:
std::队列mEventQueue;
静态系统管理器*sSystemManager;
//这将保存应用程序中的所有系统
公众:
系统();
~System();
无效addEventToQueue(EventPtr事件){
mEventQueue.push(事件);
}
void callEventQueue(){
而(!mEventQueue.empty()){
acceptEvent(mEventQueue.front().get());
mEventQueue.pop();
}
}
无效接受事件(事件*事件);
公众:
静态void sendEvent(EventPtr&event){
对于(自动系统:ssystemanager->getSystems()){
系统->addEventToQueue(事件);
}
}
};
我想知道我是否正确理解:

当我调用
System::sendEvent(std::make_shared(“testEvent”)
在一个作用域中,它将共享指针作为引用传递,该引用不会创建新指针,也不会增加引用计数。但是,
addEventToQueue
函数将参数作为对象传递,因此引用计数增加;如果我有5个系统,引用计数将是6(计算std::make_共享本身)。但是这个引用计数存储在哪里?它是通过
std::make_shared
创建的第一个共享指针吗?或者所有对象中的计数都相同?那么,当第一个对象超出范围时,其他对象会发生什么情况?他们如何知道正确的引用计数是多少,因为他们只知道“父”对象

在我读到的所有关于共享指针的文章中,引用计数的显示方式总是很常见的。计数器是静态变量吗?

计数的准确存储位置取决于实现。然而,该标准规定其行为必须确保共享一个
T
实例所有权的所有
std::shared_ptr
实例使用相同的引用计数。实际上,这意味着引用计数是动态分配的,指向它的指针由
std::shared\u ptr
的所有相关实例共享

这就是为什么
std::make_shared()
是创建共享指针的首选方法的原因之一-它可以为引用计数(以及所需的其他维护结构)和一个分配请求中的对象分配内存,而不是两个单独的分配请求。这提高了分配的性能,也可能提高了指针的使用性能(因为引用计数和对象在内存中会更接近,从而减少缓存未命中的可能性)。

计数的准确存储位置取决于实现。然而,该标准规定其行为必须确保共享一个
T
实例所有权的所有
std::shared_ptr
实例使用相同的引用计数。实际上,这意味着引用计数是动态分配的,指向它的指针由
std::shared\u ptr
的所有相关实例共享


这就是为什么
std::make_shared()
是创建共享指针的首选方法的原因之一-它可以为引用计数(以及所需的其他维护结构)和一个分配请求中的对象分配内存,而不是两个单独的分配请求。这提高了分配的性能,也可能提高了指针的使用性能(因为引用计数和对象在内存中会更接近,从而减少缓存未命中的可能性)。

注意:
make_shared
作为优点和缺点<如果你计划在对象死后很久就让
std::weak_ptr
存在,那么让共享是个坏主意。注意:
make_shared
既是优点也是缺点<如果您计划在对象死后很长一段时间内让
std::make_shared
处于
std::weak_ptr
状态,则这是一个坏主意。