C ++ основной вопрос указателя - PullRequest
0 голосов
/ 13 июля 2010

У меня есть общий указатель 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 ]

1 голос
/ 13 июля 2010

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

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

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

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

1 голос
/ 13 июля 2010

Звучит так, будто это задача для слабого_птр:

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

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

...