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__));
}
Constructor: main
Move Constructor: main moved
Destructor: main
Destructor: main moved
我有一段代码,我正在使用 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__));
}
Constructor: main
Move Constructor: main moved
Destructor: main
Destructor: main moved