1

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

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

可以说我有一些类汽车。我还有一个std::map<int carkey, Car*>就是JunkYard。

Car* 可以由某个 Driver 添加到 JunkYard,Driver 自己新建了 Car,但司机立即失去了 Car* 的所有责任。

我希望垃圾场对其所有汽车负责,人们可以访问垃圾场中的汽车以移除零件并从汽车中取出废金属,或者可以压碎但垃圾场永远摧毁它。

一天结束时,垃圾场会摧毁所有的汽车并关闭。

--

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

B)如果这是单线程的,那么最好的选择是什么-假设它仍然是 map< some_smart_car_ptr> 。我想让容器自己删除汽车。例如调用 map.erase(...) 应该删除指针以及将其从地图中删除。

4

1 回答 1

1

智能指针绝对是首选。查看 boost::shared_ptr 以获得可扩展的仅标头解决方案(并且在 TR1 和 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 ... //
}
于 2012-04-01T23:26:29.160 回答