【发布时间】: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<Event>("testEvent")); 时,它会将共享指针作为引用传递,它不会创建新指针并且不会增加引用计数。但是,addEventToQueue 函数将参数作为对象传递,因此引用计数增加;如果我有 5 个系统,则引用计数将为 6(计算 std::make_shared 本身)。但是这个引用计数存储在哪里?它是通过std::make_shared 创建的第一个共享指针吗?还是所有对象的计数都相同?那么,当第一个对象超出范围时,其他对象会发生什么?因为他们只知道“父”对象,他们怎么知道正确的引用计数是多少?
我读过的所有关于共享指针的文章,引用计数的显示方式总是很常见的。计数器是静态变量吗?
【问题讨论】:
标签: c++ c++11 stl smart-pointers