【问题标题】:how to add std::shared_ptr to multiple STL containers?如何将 std::shared_ptr 添加到多个 STL 容器?
【发布时间】:2013-12-14 11:57:48
【问题描述】:

将共享指针传递给不同对象中的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);
        }
    }
};

我想知道我是否理解正确:

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

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

【问题讨论】:

    标签: c++ c++11 stl smart-pointers


    【解决方案1】:

    确切存储计数的位置取决于实现。但是,该标准规定它的行为必须使共享T 一个实例所有权的所有std::shared_ptr&lt;T&gt; 实例使用相同的引用计数。实际上,这意味着引用计数是动态分配的,并且指向它的指针由std::shared_ptr&lt;T&gt; 的所有相关实例共享。

    这就是std::make_shared() 是创建共享指针的首选方式的原因之一——它可以在一个分配请求中为引用计数(和其他所需的维护结构)和对象分配内存,而不是两个单独的分配请求.这提高了分配的性能,也许还提高了指针的使用性能(因为引用计数和对象在内存中的距离更近,从而降低了缓存未命中的可能性)。

    【讨论】:

    • 注意:make_shared 有利有弊。 std::make_shared&lt;BigObject&gt; 是个坏主意如果你打算在对象死后很久才拥有std::weak_ptr&lt;BigObject&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多