RAII std::function
RAII with std::function
std::function 是否像 std::shared_ptr
和 std::unique_ptr
一样聪明?我觉得不是?我有一个 std::function
是 class 成员,如下所示。
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
吗?或者我应该通过像下面这样的方式将 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
有一个析构函数,可以删除它管理的任何资源(如果有的话)。这一行:
m_func = nullptr; // Is this required?
永远不需要。 class 成员的析构函数会被自动调用,如果没有,分配 nullptr
永远不会是 "the right" 的事情。如果 m_func
是一个指针,您将失去指针值和删除它指向的内容的能力。
A bit strange that it is not mentioned to be smart in official documentation at ...
从 cppreference 到 std::function
的析构函数:
Destroys the std::function instance. If the std::function is not empty, its target is destroyed also.
一般来说,可以安全地假设 class 清理了它在析构函数中管理的所有资源,否则可以认为它已损坏。在析构函数中清理资源并不是智能指针带来的新东西。智能指针仅适用于 C++ 中存在的 RAII,它始终指向封装动态分配内存管理的指针。
std::function 是否像 std::shared_ptr
和 std::unique_ptr
一样聪明?我觉得不是?我有一个 std::function
是 class 成员,如下所示。
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
吗?或者我应该通过像下面这样的方式将 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
有一个析构函数,可以删除它管理的任何资源(如果有的话)。这一行:
m_func = nullptr; // Is this required?
永远不需要。 class 成员的析构函数会被自动调用,如果没有,分配 nullptr
永远不会是 "the right" 的事情。如果 m_func
是一个指针,您将失去指针值和删除它指向的内容的能力。
A bit strange that it is not mentioned to be smart in official documentation at ...
从 cppreference 到 std::function
的析构函数:
Destroys the std::function instance. If the std::function is not empty, its target is destroyed also.
一般来说,可以安全地假设 class 清理了它在析构函数中管理的所有资源,否则可以认为它已损坏。在析构函数中清理资源并不是智能指针带来的新东西。智能指针仅适用于 C++ 中存在的 RAII,它始终指向封装动态分配内存管理的指针。