簡體   English   中英

帶有 std::function 的 RAII

[英]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永遠不是“正確”的事情。 如果m_func是一個指針,您將失去指針值和刪除它指向的內容的能力。

有點奇怪,在官方文檔中沒有提到它是聰明的......

std::function的析構函數上的cppreference

銷毀 std::function 實例。 如果 std::function 不為空,則其目標也被破壞。

一般來說,可以安全地假設 class 清理了它在其 detructor 中管理的所有資源,否則可以認為它已損壞。 在析構函數中清理資源並不是智能指針帶來的新事物。 智能指針僅適用於 C++ 中存在的 RAII,始終指向封裝動態分配的 memory 管理的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM