为什么在unique_ptr上使用std :: move会破坏它?

时间:2016-12-16 16:59:02

标签: c++ c++11 move-semantics

所以我对移动语义的理解就是这段代码:

#include <iostream>
#include <memory>

class hello {
public:
    ~hello() {
        std::cout << "destroyed" << std::endl;
    }
    hello() {
        std::cout << "constructred" << std::endl;
    }
};


void takecontrol(std::unique_ptr<hello>&& ptr) {

    ptr.release();
}

int main()
{
    auto ptr = std::make_unique<hello>();


}

应该创建内存泄漏并且只打印“构造”。

但是在运行时(http://cpp.sh/2upqq)它会破坏对象!

对我来说,它似乎应该移到ptr中的takecontrol然后释放然后不被删除,所以它不应该被销毁。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

如果您将对此功能的调用添加到主

int main()
{
    auto ptr = std::make_unique<hello>();

    takecontrol(std::move(ptr));
}

你得到了你期望的行为。