Допустимы ли множественные назначения для unique_ptr? - PullRequest
0 голосов
/ 30 января 2019

Допустимы ли множественные присвоения unique_ptr<T>?На основании выходных данных это так, но гарантированно ли будет вызываться деструктор T при использовании make_unique() и возвращаемом значении присваивается unique_ptr, который уже содержит существующую память?

#include <iostream>
#include <string>
#include <memory>

class A{
public:
    A(){ std::cout << "Construcor" << std::endl; }
    ~A(){ std::cout << "Destrucor" << std::endl; }
    void foo(){ std::cout << "foo" << std::endl; }
};

int main()
{
    std::unique_ptr<A> pointer;
    for(auto i = 0; i < 2; ++i){
        pointer = std::make_unique<A>();
        pointer->foo();
    }
}

вывод:

Construcor
foo
Construcor
Destrucor // Destructor is called because first instance of A is out of scope?
foo
Destrucor

1 Ответ

0 голосов
/ 30 января 2019

Да, это совершенно правильно.

Когда вы назначаете новый объект для unique_ptr, он уничтожает свой текущий объект и становится владельцем нового объекта.Это ожидаемое и задокументированное поведение.

Как вы можете видеть из своей регистрации, это именно то, что на самом деле происходит:

Construcor   (first call to make_unique) 
             (first assignment, nothing to log here) 
foo
Construcor   (second call to make_unique)
Destrucor    (second assignment, first object destroyed)
foo
Destrucor    (main exits, second object destroyed) 
...