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

C++: how to make std::unique_ptr<int> point to a new integer?

本文关键字:一个 整数 新整数 int unique std 何使 ptr gt C++ lt      更新时间:2023-10-16

我有以下代码:

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指向不同的整数值?谢谢!

如果您希望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)); 

std::unique_ptr 在内部存储一个指针,因此它将其数据存储在堆上的 new 上。您正在尝试从堆栈上的局部变量中移动指针,这是错误的,因为局部变量在 vlose } 处被销毁。

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

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

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托管对象,托管对象应该像a变量一样分配给堆而不是堆栈。

my_idx_ptr.reset(new int(a)); // create new int onto heap
相关文章: