为什么unique_ptr在超出范围时不会立即销毁对象?
我有以下一段代码:
struct C
{
C() {std::cout << ">>> constructorn"; }
~C() {std::cout << ">>> destructorn"; }
};
void bar(std::unique_ptr<C>&& p)
{
std::cout << "barn";
}
int main()
{
auto instance = std::make_unique<C>();
std::cout << "after constructionn";
bar(std::move(instance)); // #1
std::cout << "after barn";
return 0;
}
在第 1行,我将指针移动到函数bar。我在想,在这个调用中,指向 C 的指针从unique_ptr instance参数中移出并传递给参数unique_ptr p。如果是这样,那么当参数被销毁时,C应该在bar()的执行结束时调用p析构函数。但事实证明, 的实例C一直存活到main()的执行结束。输出如下所示:
>>> constructor
after construction
bar
after bar
>>> destructor
为什么会发生?如何解释这种行为?
回答
std::move实际上并没有移动。它只是将其转换为右值引用。
改变
void bar(std::unique_ptr<C>&& p)
到
void bar(std::unique_ptr<C> p)
在移动构造函数中实际进行移动。
- Or `bar` could do something like `std::unique_ptr<C> x(std::move(p))`, that would move too.