我已經從Objective-C背景轉向了C++ 11,並且我努力接受的一件事是C++ 11的不同捕獲語義lambdas與Objective-C「塊」。 (請參閱here進行比較)。異步使用C++ 11 lambda,安全
在Objective-C中,與C++類似,如果引用成員變量,則會隱式捕獲指針self
/this
。但由於在Objective-C中的所有對象都有效地「共享指針」,使用C++的術語,你可以這樣做:
doSomethingAsynchronously(^{
someMember_ = 42;
});
...和你保證其成員你所訪問的對象將在塊執行時保持活動狀態。你不必考慮它。在C++中的等效似乎是這樣的:
// I'm assuming here that `this` derives from std::enable_shared_from_this and
// is already owned by some shared_ptr.
auto strongThis = shared_from_this();
doSomethingAsynchronously([strongThis, this] {
someMember_ = 42; // safe, as the lambda holds a reference to this
// via shared_ptr.
});
在這裏,你需要記住捕捉的shared_ptr除了這個指針。是否有一些不太容易出錯的方法來實現這一點?
*「你不必考慮它。」*開始考慮它。它導致更好的設計。 – Pubby
@Pubby但事情是,這是使用塊的輕鬆使用,使得它們在Obj-C世界中的一次性異步任務非常有用和普遍。如果他們擁有C++ 11語義,並且每次都必須問自己「這個對象是否還活着,這個對象是否還活着,這個對象是否還活着......」,我想很多人都會被誘惑說「擰它,我會同步做。」 –
從'this'創建一個共享指針並不能保證它仍然存在,除非對象本身已經被共享指針所擁有並且您正在複製它。創建一個新的共享指針(通過'new shared_ptr(this)'或'make_shared (this)')只能用於獲得雙重刪除,除非內存會泄露。那麼,就你的情況而言,如果此時不創建共享指針,那麼'this'如何被刪除? –
Agentlien