例如,我非常确定这是有效的。
int foo = 51;
int* bar = &foo;
foo = 3;
因此条形码仍有效,*bar == 3
。
如果我们说
怎么办?std::unique_ptr<int> foo(new int(51)); // should probably use make_unique
int* bar = foo.get();
foo.reset(new int(3));
我保证*bar == 3
?
或者我通过继续引用bar来导致未定义的行为?
答案 0 :(得分:8)
不,一点也不。您将获得未定义的行为,因为unique_ptr
管理的原始指针由reset
更改。事实上,unique_ptr
删除托管指针并重新分配一个新指针,因此旧指针将继续指向旧地址,该地址不再有效。您的代码等同于:
#include <iostream>
int main()
{
int* managed = new int(51); // equivalent to unique_ptr(new int(51));
int* bar = managed; // equivalent of unique_ptr::get
delete managed; managed = new int(3); // equivalent to unique_ptr::reset(new int(3))
std::cout << *bar << std::endl; // Wrong!!! Undefined behaviour, bar is dangling!
}
您的第一个代码段确实是正确的,因为您没有更改任何地址,您只是更改指针指向的变量,因此当然取消引用指针将获得更新的值。
答案 1 :(得分:7)
不,如果您重置unique_ptr
,它将删除它拥有的指针。
你可以这样做:
int* bar = foo.release();
这会导致foo
放弃其指针的所有权并将其返回。
答案 2 :(得分:0)
不,std :: unique_ptr.reset将删除现有指针。
请参阅http://www.cplusplus.com/reference/memory/unique_ptr/reset/
使用release。