какой тип указателя использовать для собственной коллекции указателей - PullRequest
0 голосов
/ 02 апреля 2012

Итак, я довольно много гуглил, пытаясь выяснить, есть ли какой-нибудь лучший умный указатель, чтобы справиться с этим, но я не смог сделать правильный выбор.

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

Позволяетскажи у меня какой-то класс автомобилей.У меня также есть std::map<int carkey, Car*>, который является JunkYard.

Автомобиль * может быть добавлен в JunkYard каким-либо Водителем, сам Водитель новичок в Автомобиле, но водитель немедленно теряет всю ответственность за Автомобиль *.

Я бы хотел, чтобы JunkYard отвечал за все свои автомобили. Автомобили на JunkYard могут получить доступ к людям, чтобы снять, скажем, части и взять металлолом из машины, или могут быть разбиты, но JunkYard уничтожает его навсегда.

В конце дня JunkYard уничтожает все свои автомобили и отключается.

-

A) Если бы это было многопоточное приложение, доступ к которому могли получить водителимашины одновременно, в то время как JunkYard мог уничтожать машины, я думал, что вероятно будет лучше использовать shared_ptr?Это излишне, хотя?Другие потоки могут получить доступ к машине, но они никогда не получат долгосрочное владение ею, она всегда должна принадлежать JunkYard.

B) Если бы это был однопоточный, то это был бы лучший выбор - при условии, что он все ещекарта .Я хочу, чтобы контейнер забрал машину, удалив Автомобили сами.Например, вызов map.erase (...) должен удалить указатель, а также удалить его с карты.

1 Ответ

0 голосов
/ 02 апреля 2012

Умные указатели, безусловно, предпочтительнее.Посмотрите на 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 ... //
}
...