此代码正确吗?
auto v = make_unique<int>(12);
v.release(); // is this possible?
它等于delete
原始指针吗?
Answers:
不,代码会导致内存泄漏。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
detach
这样的东西会比release
。
release
?
release
由于您未将原始指针分配给任何对象,因此它将泄漏您的原始指针。
它旨在用于类似
int* x = v.release();
这意味着v
不再管理该指针的生存期,而是将原始指针所有权委托给x
。如果只是release
不分配任何内容,则会泄漏原始指针。
.get()
然后.reset()
在周围交换内容,但实际上我要执行的操作是在.release()
后面.reset()
,以确保.reset()
调用不会delete
出现旧对象。.release()
然后.get()
释放指针后,执行与相同的功能。
.reset()
只是简单的post-后.release()
。
.get()
后跟a.reset()
会引起问题。该.get()
会给你一个不拥有指针,然后.reset()
将调用delete
,因此你的原始指针从get
现已形成“悬摆指针”,并访问它是未定义的行为。
对于任意类型,可能有点棘手:
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对象返回的删除器是好的。
int* raw
和int *raw
,但是这是我第一次见过int * raw