[英]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
永遠不是“正確”的事情。 如果m_func
是一個指針,您將失去指針值和刪除它指向的內容的能力。
有點奇怪,在官方文檔中沒有提到它是聰明的......
從std::function
的析構函數上的cppreference :
銷毀 std::function 實例。 如果 std::function 不為空,則其目標也被破壞。
一般來說,可以安全地假設 class 清理了它在其 detructor 中管理的所有資源,否則可以認為它已損壞。 在析構函數中清理資源並不是智能指針帶來的新事物。 智能指針僅適用於 C++ 中存在的 RAII,始終指向封裝動態分配的 memory 管理的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.