如果我使用unique_ptr的原始指针然后使用reset,原始指针仍然保证有效吗?

时间:2015-05-13 20:38:14

标签: c++ unique-ptr

例如,我非常确定这是有效的。

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来导致未定义的行为?

3 个答案:

答案 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