unique_ptr 两次调用析构函数

unique_ptr is calling destructor twice

我有一段代码,我正在使用 unique_ptr

class Abc {
public:
    std::string msg;
    Abc(std::string m) {
        msg = m;
        std::cout << "Constructor: " << msg << std::endl;
    }  
    ~Abc() {
        std::cout << "Destructor: " << msg << std::endl;
    }
};


int main() {
    auto p = std::make_unique<Abc>(Abc(__func__));
}

但是析构函数被调用了两次。有没有办法让它只调用一次析构函数?

你首先构建了一个临时的Abc(即Abc(__func__)),然后将其传递给std::make_unique,它从临时构建底层Abc(通过Abc 的移动构造函数);即构造了两个 Abc 个对象,然后也调用了两次析构函数。

可以直接将__func__传递给std::make_unique,即不需要从头构造临时的Abc

auto p = std::make_unique<Abc>(__func__); // constructs Abc via Abc::Abc(std::string) directly

您创建了两个对象并看到它们都被销毁了。 Abc(__func__) 是一个临时文件,在 main 的行尾被销毁。

添加用户定义的 move 构造函数以查看 make_unique move 如何构造对象:

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

class Abc {
public:
    std::string msg;
    Abc(std::string m) {
        msg = m;
        std::cout << "Constructor: " << msg << std::endl;
    }
    Abc(Abc&& other){
        msg = other.msg + " moved";
        std::cout << "Move Constructor: " << msg << "\n";
    }  
    ~Abc() {
        std::cout << "Destructor: " << msg << std::endl;
    }
};


int main() {
    auto p = std::make_unique<Abc>(Abc(__func__));
}

Output:

Constructor: main
Move Constructor: main moved
Destructor: main
Destructor: main moved