哪种类型的指针用于拥有指针集合

时间:2012-04-01 21:36:16

标签: c++ stdmap boost-smart-ptr

所以,我已经做了一些谷歌搜索试图弄清楚是否有一些最好的智能指针来处理这个,但我还没有能够找到一个好的选择。

struct Car
{
    int m_doors;
    int m_headlights;
    //etc..
}

让我说我有一些班车。我还有一个{J} Yard std::map<int carkey, Car*>

Car *可以被一些驾驶员添加到JunkYard,驾驶员本身也是新车,但驾驶员立即失去了Car *的所有责任。

我希望JunkYard对其所有车辆负责,JunkYard中的汽车可以被人们接触以移除说出的部件并从汽车中取出废金属,或者可以被压碎,但JunkYard会永远摧毁它。

在一天结束时,JunkYard摧毁了所有的汽车并关闭了。

-

A) 如果这是一个多线程应用程序,其中驱动程序可以同时访问汽车而JunkYard可以销毁汽车我认为可能是shared_ptr最好?这有点矫枉过正吗?其他线程可以访问汽车,但他们永远不会长期拥有它,它必须始终属于JunkYard。

B) 如果这是单线程,那么最好的选择是什么 - 假设它仍然是一个地图&lt; some_smart_car_ptr&GT; 。我希望容器可以自行删除汽车。例如,调用map.erase(...)应删除指针并将其从地图中删除。

1 个答案:

答案 0 :(得分:0)

智能指针绝对是首选。请查看boost :: shared_ptr以获得可以扩展良好的仅限标头的解决方案(并且在TR1&amp; C ++ 11 / C ++ 0x中)。

boost::unordered_map<int carKey, boost::shared_ptr<Car *> > myCollection;

然后,每当您引用数据以增加引用计数时,只需实例化一个新的shared_ptr。仅这一点就可以防止过早删除。确保锁定指针采集和放大器。在作用域互斥体中的集合查找。一种类似的方法:

boost::shared_ptr<Car *> CarManager::get(int carKey) {
    boost::mutex::scoped_lock lock(mutex);

    // ... etc ... //
}