Код C ++:
unique_ptr<int> a = make_unique<int>(159);
auto var = a.get(); // Edited a => a.get() sorry
a.release();
std::cout<<*var<<std::endl; // prints "159"
Является var
висячий указатель после этого кода?
Ваш код абсолютно действителен. a.release()
отсоединяет динамически размещенный объект от уникального указателя, поэтому a
больше не владеет целым числом, но ничего не удаляется.
У вас будет утечка памяти, если вы в конце концов не позвоните delete var
, хоть.
Нет, после этого кода var
это не висящий указатель. Да, если не позвонишь delete
явно или использовать еще один умный указатель у вас будет утечка памяти. Умные указатели не гарантируют, что не будет висящих указателей, если вы будете обрабатывать их вручную, например, позвонив release
явно после хранения указателя в другом месте.
Кстати, функция make_unique
вы используете нестандартно (хотя должно быть в следующей редакции), поэтому ваш код не переносим.
нет
вот эквивалент
unique_ptr<int> a = make_unique<int>(159);
auto var = a.release(); // returns contained pointer and sets a to be empty
std::cout<<*var<<std::endl; // var is still valid here, though you should delete it after