C ++:如何使std :: unique_ptr <int>指向新的整数?

时间:2019-01-31 07:36:47

标签: c++ unique-ptr

我有以下代码:

int my_function(int x) {
    return x+1;
}

void find_my_next_idx(std::unique_ptr<int> my_idx_ptr) {
    // do something here
    // update my_idx_ptr
}

std::unique_ptr<int> my_idx_ptr = std::make_unique<int>(my_function(5));
if (!my_flag) {
    int a = 4;
    my_idx_ptr.reset(std::move(&a));
}

find_my_next_idx(my_idx_ptr); // --> error line

然后我遇到以下错误:

error: call to implicitly-deleted copy constructor of 'std::unique_ptr<int>'

我做错了什么?以及如何使my_idx_ptr指向不同的整数值?谢谢!

3 个答案:

答案 0 :(得分:1)

如果您希望unique_ptr包含4值,则只需执行以下操作:

my_idx_ptr = std::make_unique(4);

这样做时,您不必担心前一个对象会发生什么,因为它会破坏前一个对象并获得新对象的所有权。

并且由于无法复制unique_ptr(这是调用find_my_next_idx时错误的原因),因此您可以:

  1. 通过引用传递unique_ptr
  2. 在函数调用中对其使用std::move

第一个选项将要求您将函数原型更改为:

void find_my_next_idx(std::unique_ptr<int>& my_idx_ptr);

第二个选项将要求您像这样致电:

find_my_next_idx(std::move(my_idx_ptr)); 

答案 1 :(得分:0)

std :: unique_ptr在内部存储指针,因此它将数据与new一起存储在堆中。您正在尝试从堆栈上的局部变量移动std :: move指针,这是错误的,因为局部变量已在}处破坏。

尝试简单地使用my_idx_ptr = std :: make_unique(5);

通常,您很少使用std :: move,因为编译器会根据变量是左值还是右值来选择正确的函数。

答案 2 :(得分:0)

unique_ptr无法复制,但是您可以移动它:

std::unique_ptr<int> my_idx_ptr = std::make_unique<int>(my_function(5));
if (!my_flag) {
    int a = 4;
    my_idx_ptr.reset(std::move(&a));
}

find_my_next_idx( std::move(my_idx_ptr) );

您不应将指向局部变量的指针传递给unique_ptr,因为unique_ptr会被delete运算符删除拥有的对象,托管对象应分配到堆而不是堆栈上,就像{{1} }变量。

a