2015-03-20 2 views
-3
shared_ptr<int> ptr (new int(5)); 
ptr = new int(6); // this is illegal 

Как перенаправить ptr из существующего объекта (int 5) на другой объект?Перенаправить share_ptr, чтобы указать на другой объект

Обратите внимание, что импликация, ref count to object int 5 должна быть уменьшена. и объект ptr должен указывать на новый объект int 6 после предполагаемого «присвоения».

Cheers.

+3

ли вы по крайней мере попытался посмотреть на [интерфейсе 'станд :: shared_ptr'] (http://en.cppreference.com/ж/CPP/память/shared_ptr)? – Angew

+1

Предпочитают ['std :: make_shared'] (http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared):' auto ptr = std :: make_shared (5); ptr = std :: make_shared (6); '. Он более прост, легче набирать - с 'auto', что есть, и сложнее совершать ошибки. – Casey

ответ

2

Ответ прост:

shared_ptr<int> ptr (new int(5)); 
ptr.reset(new int(6)); // this is legal 

И еще уточнение: метод .RESET() уменьшает счетчик ссылок на целое число 5. Таким образом, если вы проверяете программу с Valgrind, он не утечка любой памяти.

4

Конструктор shared_ptr от необработанных указателей - explicit, чтобы предотвратить случайное владение указателями, которые должны принадлежать (и их не следует удалять). Это означает, что вы не можете написать:

shared_ptr<int> p = new int(5); 

и вместо этого вы должны написать:

shared_ptr<int> p(new int(5)); 

вызывать явный конструктор явно.

По аналогичным причинам назначение из исходных указателей также не поддерживается. Вам нужно написать либо:

p = shared_ptr<int>(new int(6)); 

или:

p.reset(new int(6)); 
Смежные вопросы