RAII std::function

RAII with std::function

std::function 是否像 std::shared_ptrstd::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 ...

cppreferencestd::function 的析构函数:

Destroys the std::function instance. If the std::function is not empty, its target is destroyed also.

一般来说,可以安全地假设 class 清理了它在析构函数中管理的所有资源,否则可以认为它已损坏。在析构函数中清理资源并不是智能指针带来的新东西。智能指针仅适用于 C++ 中存在的 RAII,它始终指向封装动态分配内存管理的指针。