RAII与std::函数

问题描述 投票:0回答:1

程式 聪慧过人 std::shared_ptrstd::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? 
    }
}

问题。 是否必须将 nullptrm_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
    }
}
c++ c++11 smart-pointers std-function raii
1个回答
2
投票

std::function 有一个destructor,可以删除它所管理的任何资源(如果有的话)。这一行。

   m_func = nullptr; // Is this required? 

是从来不需要的。一个类的成员destructor会被自动调用,如果没有,则会将其分配给 nullptr 从来都不是 "正确 "的事情。如果 m_func 是一个指针,你会失去指针的值和删除它所指向的东西的能力。

有点奇怪,在官方文档中没有提到它是智能的。

来自 cppreference 关于 std::function的析构器。

销毁 std::function 实例。如果std::function不是空的,它的目标也会被销毁。

一般来说,我们可以假定一个类会清理它在dettructor中管理的任何资源,否则它就会被认为是坏的。清理破坏者中的资源并不是智能指针带来的新东西。智能指针只应用了C++中一直存在的RAII来封装动态分配内存的管理。

© www.soinside.com 2019 - 2024. All rights reserved.