У меня есть вектор указателей на объекты, созданные с помощью 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 }
}