此代码是否正确?
auto v = make_unique<int>(12); v.release(); // is this possible?
它是否等同于原始指针的delete?
delete
vngu2lb81#
否,该代码会导致内存泄漏。release用于释放托管对象的所有权,a而不 * 删除该对象:
release
auto v = make_unique<int>(12); // manages the object int * raw = v.release(); // pointer to no-longer-managed object delete raw; // needs manual deletion
除非您有充分的理由在没有安全网的情况下处理原始内存,否则不要这样做。若要删除对象,请使用reset。
reset
auto v = make_unique<int>(12); // manages the object v.reset(); // delete the object, leaving v empty
rqdpfwrv2#
此代码是否正确?否。使用std::unique_ptr<>::reset()删除内部原始指针:
std::unique_ptr<>::reset()
auto v = std::make_unique<int>(12); v.reset(); // deletes the raw pointer
完成后,std::unique_ptr<>::get()将返回nullptr(除非您为std::unique_ptr<>::reset()提供了非nullptr参数)。
std::unique_ptr<>::get()
nullptr
myss37ts3#
此代码是否正确?它不是,而且会泄漏。release()只是放弃这个unique_ptr在被调用之前所拥有的内存所有权,并返回一个指针,现在调用者负责该指针,包括必须手动删除它。如果不对release()返回的指针赋值,就会出现泄漏。对unique_ptr的显式删除是reset()。但请记住,unique_ptr的存在是为了使您不必直接管理它们所拥有的内存。也就是说,您应该知道,一旦unique_ptr超出作用域,它将安全地删除其底层原始指针。因此,您应该有一个很好的理由对自动内存管理对象执行手动内存管理。
release()
unique_ptr
reset()
krugob8w4#
release将泄漏原始指针,因为您没有将其赋值给任何对象。它的用途是
int* x = v.release();
这意味着v不再管理该指针的生存期,它将原始指针的所有权委托给x。如果您只使用release而不赋值,则会泄漏原始指针。
v
x
eit6fx6z5#
对于任意类型,这可能有点棘手:
unique_ptr<Foo> v = get_me_some_foo(); // manages the object Foo * raw = v.release(); // pointer to no-longer-managed object delete raw;
几乎是正确的。
unique_ptr<Foo> v = get_me_some_foo(); // manages the object Foo * ptr = v.release(); // pointer to no-longer-managed object v.get_deleter() ( ptr );
这一条在所有情况下都是正确;在类型Foo上可能定义了一个自定义的删除器,但是使用unique_ptr对象返回的删除器对所有情况都有好处。
5条答案
按热度按时间vngu2lb81#
否,该代码会导致内存泄漏。
release
用于释放托管对象的所有权,a而不 * 删除该对象:除非您有充分的理由在没有安全网的情况下处理原始内存,否则不要这样做。
若要删除对象,请使用
reset
。rqdpfwrv2#
此代码是否正确?
否。使用
std::unique_ptr<>::reset()
删除内部原始指针:完成后,
std::unique_ptr<>::get()
将返回nullptr
(除非您为std::unique_ptr<>::reset()
提供了非nullptr
参数)。myss37ts3#
此代码是否正确?
它不是,而且会泄漏。
release()
只是放弃这个unique_ptr
在被调用之前所拥有的内存所有权,并返回一个指针,现在调用者负责该指针,包括必须手动删除它。如果不对
release()
返回的指针赋值,就会出现泄漏。对
unique_ptr
的显式删除是reset()
。但请记住,unique_ptr
的存在是为了使您不必直接管理它们所拥有的内存。也就是说,您应该知道,一旦unique_ptr
超出作用域,它将安全地删除其底层原始指针。因此,您应该有一个很好的理由对自动内存管理对象执行手动内存管理。
krugob8w4#
release
将泄漏原始指针,因为您没有将其赋值给任何对象。它的用途是
这意味着
v
不再管理该指针的生存期,它将原始指针的所有权委托给x
。如果您只使用release
而不赋值,则会泄漏原始指针。eit6fx6z5#
对于任意类型,这可能有点棘手:
几乎是正确的。
这一条在所有情况下都是正确;在类型Foo上可能定义了一个自定义的删除器,但是使用unique_ptr对象返回的删除器对所有情况都有好处。