Пустой уникальный указатель вызывает деструктор при выходе из области видимости - PullRequest
0 голосов
/ 29 марта 2019

Итак, я написал код, чтобы опробовать умные указатели, которые поставляются с библиотекой 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 голосов
/ 29 марта 2019

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)));
}
...