为什么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.

以上是为什么unique_ptr在超出范围时不会立即销毁对象?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>