【发布时间】:2020-08-19 08:38:56
【问题描述】:
std::function 本质上是否像 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?或者我应该通过执行以下操作将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非常非常聪明。按照您发布到析构函数部分的链接。 -
好的。听起来我不需要将它包装在唯一或共享指针中。
-
有点奇怪,在en.cppreference.com/w/cpp/utility/functional/function的官方文档中没有提到它是聪明的。官方文档宁愿在注释中提到这样的事情,这有点令人困惑并且听起来不是 RAII - “当从没有尾随返回类型的 lambda 表达式初始化结果类型为引用的 std::function 时应小心。”
-
该注释与您的问题没有太大关系。请参阅
std::function::~function以获取您问题的直接答案:销毁 std::function 实例。如果 std::function 不为空,它的目标也被销毁。 -
我很确定所有 std 类都遵守 3/5/0 规则,即使可加入的
std::thread可能被认为是特殊的;-)
标签: c++ c++11 smart-pointers std-function raii