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 стал недействительным в какой-то другой части моего кода?
Не думай так.
Но если вы используете слабый указатель, это не потребуется.