这段代码是否正确?
auto v = make_unique<int>(12);
v.release(); // is this possible?
它等同于原始指针的delete
吗?
答案 0 :(得分:103)
不,代码会导致内存泄漏。 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
。
auto v = make_unique<int>(12); // manages the object
v.reset(); // delete the object, leaving v empty
答案 1 :(得分:21)
这段代码是否正确?
没有。使用std::unique_ptr<>::reset()
删除内部原始指针:
auto v = std::make_unique<int>(12);
v.reset(); // deletes the raw pointer
完成此操作后,std::unique_ptr<>::get()
将返回nullptr
(除非您向nullptr
提供了非std::unique_ptr<>::reset()
参数。)
答案 2 :(得分:17)
这段代码是否正确?
它不会,也会泄漏。
release()
让调用代码收回unique_ptr
所持有的内存的所有权,直到调用它为止。如果您没有指定release()
返回的指针,那么您只会有泄漏。
unique_ptr
的明确删除是reset()
。但请记住unique_ptr
存在,以便您不必直接管理他们所拥有的内存。也就是说,你应该知道unique_ptr
一旦超出范围就会安全地删除它的底层原始指针。
因此,您应该有充分的理由在自动内存管理对象上执行手动内存管理。
答案 3 :(得分:11)
release
会泄漏您的原始指针,因为您没有将其分配给任何内容。
用于
之类的东西int* x = v.release();
这意味着v
不再管理该指针的生命周期,它将原始指针所有权委托给x
。如果只是release
而没有分配任何内容,则会泄漏原始指针。
答案 4 :(得分:1)
任意类型可能有点棘手:
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对象返回的删除器适用于所有情况。