我有以下代码:
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
指向不同的整数值?谢谢!
答案 0 :(得分:1)
如果您希望unique_ptr
包含4值,则只需执行以下操作:
my_idx_ptr = std::make_unique(4);
这样做时,您不必担心前一个对象会发生什么,因为它会破坏前一个对象并获得新对象的所有权。
并且由于无法复制unique_ptr
(这是调用find_my_next_idx
时错误的原因),因此您可以:
unique_ptr
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