离开范围时,空的唯一指针调用析构函数

时间:2019-03-29 13:04:25

标签: c++ unique-ptr

所以我写了一些代码来尝试c ++ std库附带的智能指针。为此,我创建了一个测试类MyClass,该类在销毁时会生成控制台输出。我的代码如下:

std::unique_ptr<MyClass> getMyClassPtr(int a = 0, char b = 'a', double c = 1.1)
{
    std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>(MyClass(a, b, c));
    return ptr;
}

int main()
{
    std::unique_ptr<MyClass> pMyClass = getMyClassPtr();

    if (pMyClass)
        std::cout << "MyClass Values:\na = " << pMyClass->getA() << "\nb = "
          << pMyClass->getB() << "\nc = " << pMyClass->getC() << "\n";
}

现在我偶然发现,MyClass的析构函数是在main的结尾处调用的,但也在getMyClassPtr()的末尾被现在为空的指针调用了。

哪个物体在这里被破坏?

对我来说,对象的析构函数被调用但并没有真正消失似乎很奇怪。是否正在复制对象?

1 个答案:

答案 0 :(得分:0)

getMyClassPtr()应该返回如下:std::move(ptr);否则ptr会在getMyClassPtr的范围达到时删除。

您还可以重构函数以将其作为参考返回,然后std :: move不是强制性的,但这不是一个好习惯。

std::unique_ptr<MyClass> getMyClassPtr(int a = 0, char b = 'a', double c = 1.1)
{
    return std::move(std::make_unique<MyClass>(MyClass(a, b, c)));
}