У меня есть вектор указателей на объекты, созданные с помощью new .Несколько потоков получают доступ к этому вектору безопасным образом с различными методами получения / установки.Однако поток может удалить один из объектов, и в этом случае указатель другого потока на объект больше не действителен.Как метод может узнать, действителен ли указатель?Варианты 1 и 2 на самом деле, кажется, работают хорошо.Я не знаю, как они будут масштабироваться.Каков наилучший подход?Существует ли портативная версия 3?
Тестирование примеров правильности указателей, которые работают:
1. Используйте целые числа вместо указателей.Хеш (std :: map) проверяет, является ли указатель действительным.Публичные методы выглядят так:
get(size_t iKey)
{
if((it = mMap.find(iKey)) != mMap.end())
{
TMyType * pMyType = it->second;
// do something with pMyType
}
}
2. Имеет вектор shared_ptr .Каждый поток пытается вызвать lock () на своем weak_ptr .Если возвращенный shared_ptr равен нулю, мы знаем, что кто-то удалил его, пока мы ждали.Публичные методы выглядят так:
get(boost::weak_ptr<TMyType> pMyType)
{
boost::shared_ptr<TMyType> pGOOD = pMyType.lock();
if (pGOOD != NULL)
{
// Do something with pGOOD
}
}
3. Проверка на нулевое значение для простых необработанных указателей?Возможно ли это?
get(TMyType * pMyType)
{
if(pMyType != NULL){ //do something }
}