这段代码正确吗?
auto v = make_unique<int>(12);
v.release(); // is this possible?
它相当于原始指针的
delete
吗?
不,该代码会导致内存泄漏。
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
这段代码正确吗?
不。使用
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()
参数)。
这段代码正确吗?
不是,并且会泄漏。
release()
只是释放此 unique_ptr
在被调用之前所持有的内存所有权,并返回调用者现在负责的指针,包括必须手动删除它。
如果你不分配
release()
返回的指针,你就会发生泄漏。
对
unique_ptr
的显式删除将是 reset()
。但请记住,unique_ptr
的存在是为了让你不必直接管理它们所持有的内存。也就是说,您应该知道,一旦超出范围,unique_ptr
将安全地删除其底层原始指针。
因此,您应该有充分的理由对自动内存管理对象执行手动内存管理。
release
会泄漏你的原始指针,因为你没有将它分配给任何东西。
它的用途是
int* x = v.release();
这意味着
v
不再管理该指针的生命周期,它将原始指针所有权委托给 x
。如果您只是 release
而不分配任何内容,则会泄漏原始指针。
对于任意类型来说可能有点棘手:
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 对象返回的删除器适用于所有情况。
如果它在系统架构的设计范围内,则可能不会泄漏,如果您确定数据位于其他地方并且在其他地方进行管理,则只需将其丢弃并放弃其他东西拥有的表示形式,然后你得到了一个弱 ptr...这是 C++ 中的一个智能指针...如果你编写每个复制构造函数来删除(除了少数某些类之外),那非常酷。取决于你如何编码......像往常一样。但如果你正在学习..打破它,打破它到高天,你就会看到什么指向哪里以及为什么:)