是 程式 聪慧过人 std::shared_ptr
和 std::unique_ptr
? 我想没有吧?我有一个 std::function
是一个类成员,如下图所示。
class MyClass {
typedef std::function<void(void)> Func;
Func m_func;
public:
MyClass() {
m_func = []() {
std::cout << "Func called" << std::endl;
}
}
~MyClass() {
m_func = nullptr; // Is this required?
}
}
问题。 是否必须将 nullptr
到 m_func
在destructor中?或者我应该让 m_func
变成一个智能指针,做如下操作?还是说 m_func
是否默认是智能的,并且隐含在RAII中?
class MyClass {
typedef std::function<void(void)> Func;
std::unique_ptr<Func> m_func;
public:
MyClass() {
m_func = std::make_unique<Func>();
*m_func = []() {
std::cout << "Func called" << std::endl;
}
}
~MyClass() {
// auto released
}
}
std::function
有一个destructor,可以删除它所管理的任何资源(如果有的话)。这一行。
m_func = nullptr; // Is this required?
是从来不需要的。一个类的成员destructor会被自动调用,如果没有,则会将其分配给 nullptr
从来都不是 "正确 "的事情。如果 m_func
是一个指针,你会失去指针的值和删除它所指向的东西的能力。
有点奇怪,在官方文档中没有提到它是智能的。
来自 cppreference 关于 std::function
的析构器。
销毁 std::function 实例。如果std::function不是空的,它的目标也会被销毁。
一般来说,我们可以假定一个类会清理它在dettructor中管理的任何资源,否则它就会被认为是坏的。清理破坏者中的资源并不是智能指针带来的新东西。智能指针只应用了C++中一直存在的RAII来封装动态分配内存的管理。