首页 > 解决方案 > unique_ptr 两次调用析构函数

问题描述

我有一个代码块,我正在使用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__));
}

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

标签: c++smart-pointersunique-ptr

解决方案


您首先构造一个临时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

推荐阅读