C++ основной вопрос указателя

У меня есть общий указатель shared_ptr<T> pointer1(new T(1));,

Теперь в какой-то другой части кода у меня есть явная копия pointer2 (думаю, это будет храниться в std::map или какой-то другой контейнер). Допустим, что копия была сделана как map.insert(make_pair(key1, pointer1));,

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

Есть ли способ заставить освобождение памяти для второго указателя, если я знаю, что pointer1 стал недействительным в какой-то другой части моего кода?

Или я должен пойти по уродливому пути - время от времени проверяйте мою карту на предмет указателей, которые имеют ptr.unique() установлен в true и уничтожить их?

Может быть, какие-нибудь альтернативы / советы?


Редактировать - простой пример кода

std::map<int, shared_ptr<int> > map;

{
   shared_ptr<int> pointer1(new int(5));
   map.insert(std::make_pair(0, pointer1));
}

Есть ли способ / хитрость, чтобы карта содержала <0, shared_ptr[NULL]> вместо <0, shared_ptr[5]> после того, как эти операции произойдут?

Спасибо

2 ответа

Решение

Похоже, это задача для weak_ptr:

http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/weak_ptr.htm

Попробуйте поместить их в свою таблицу вместо shared_ptr.

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

Вы должны взглянуть на boost::weak_ptr. Если связанный с ним shared_ptr был сброшен, то о нем будет знать слабый_ptr.

Есть ли способ принудительно освободить память для второго указателя, если я знаю, что pointer1 стал недействительным в какой-то другой части моего кода?

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

Другие вопросы по тегам