亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c++ lambda捕獲this 導致多線程下類釋放后還在使用的錯誤問題

 更新時間:2023年02月03日 11:03:13   作者:大老虎打老虎  
Lambda表達式是現(xiàn)代C++的一個語法糖,挺好用的。但是如果使用不當,會導致內存泄露或潛在的崩潰問題,這里總結下c++ lambda捕獲this 導致多線程下類釋放后還在使用的錯誤問題,感興趣的朋友一起看看吧

Lambda介紹

“Lambda表達式是現(xiàn)代C++在C ++ 11和更高版本中的一個新的語法糖 ,在C++11、C++14、C++17和C++20中Lambda表達的內容還在不斷更新。 lambda表達式(也稱為lambda函數(shù))是在調用或作為函數(shù)參數(shù)傳遞的位置處定義匿名函數(shù)對象的便捷方法。通常,lambda用于封裝傳遞給算法或異步方法的幾行代碼 。

c++的lambda 可以捕獲this指針,使lambda可以在自定義的function內使用類的成員函數(shù),這是因為捕獲this后隱式的在成員變量前加了this

但是需要注意的是,這里捕獲this,不是以一種拷貝的方式,更像是一種引用(或者別名,描述可能不準確),當在外面這個類的生命周期結束時,lambda內部還在調用這個類的成員函數(shù),那么就會出錯

我遇到的問題是 捕獲了類A的this,對A的一個shared_ptr進行操作。偶然會出現(xiàn)shared_ptr的內部基類spt_count_base的報錯。看了下這個shared_ptr 的use_count和weak_count都是0,

這就非常奇怪。shared_ptr計數(shù)是線程安全的,(但是實際指向對象和計數(shù)不是原子操作),并且訪問這個sptr也加了鎖,為什么會出現(xiàn)被釋放了的情況。

大概再說下情景

class A

{
  shared_ptr<B> sptr;

  sptr.func = [this](){ do something};

}
class B

{
  shared_ptr<map> sptrMap;

  func()

  {

      //概率崩潰
             sptrMap.erase();

  }
}

當A被析構后,B注冊的回調被另一個線程調用了func();這時可能會出現(xiàn)A開始析構,剛好析構到B,并且B的sptrMap已經(jīng)析構時,出現(xiàn)崩潰。但這個順序不是確定的無法保證,所以也不一定必出現(xiàn)這種現(xiàn)象。

防止這種現(xiàn)象可以加個判斷,在sptrMAp不為空時不進行析構?;蛘哂脀eak_ptr.在捕獲this前,用 weak_ptr p = std::shared_from_this;然后在lambda最開始用p.lock判斷A是否釋放

通過這個了解到了lambda捕獲的一個坑,及類析構的順序及析構時線程安全的保護

另附實際代碼

using namespace std;
struct Foo {
  std::unique_ptr<int> p;
  std::function<void()> f() {
    p.reset(new int(1));
    return [=] { cout << *p << endl; };
  }
};

int main() {
  auto foo = new Foo();
  auto f = foo->f();
  delete foo;
  f();
}

運行結果為0而非1,而且這里輸出0是未定義行為,因為訪問的實際上是被回收的空間,只是因為編譯器的delete并沒有對回收的空間做額外的操作,所以p指向的仍然是原來那塊,只不過那塊已經(jīng)被unique_ptr的析構函數(shù)自動清除了,只不過將清除的部分全部置為0而已。

到此這篇關于c++ lambda捕獲this 導致多線程下類釋放后還在使用的錯誤的文章就介紹到這了,更多相關c++ lambda捕獲this內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解析C++中不能重載為友元函數(shù)的四個運算符

    解析C++中不能重載為友元函數(shù)的四個運算符

    以下是對C++中不能重載為友元函數(shù)的四個運算符進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • C++迭代器iterator詳解

    C++迭代器iterator詳解

    這篇文章主要為大家詳細介紹了C++迭代器模式Iterator,具有一定的參考價值,感興趣的小伙伴們可以參考一下希望能給你帶來幫助
    2021-08-08
  • C語言中魔性的float浮點數(shù)精度問題

    C語言中魔性的float浮點數(shù)精度問題

    這篇文章主要介紹了魔性的float浮點數(shù)精度問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 對C++默認構造函數(shù)的一點重要說明

    對C++默認構造函數(shù)的一點重要說明

    下面小編就為大家?guī)硪黄獙++默認構造函數(shù)的一點重要說明。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Qt使用QCamera實現(xiàn)切換相機,分辨率和圖像捕獲功能

    Qt使用QCamera實現(xiàn)切換相機,分辨率和圖像捕獲功能

    這篇文章主要為大家介紹了如何利用Qt中的相機類QCamera,取景器類QCameraViewfinder,圖像捕獲類QCameraImageCapture實現(xiàn)切換相機、分辨率和圖像捕獲功能,需要的可以了解一下
    2023-04-04
  • c++ 智能指針基礎詳解

    c++ 智能指針基礎詳解

    這篇文章主要介紹了c++ 智能指針基礎的相關資料,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下
    2021-02-02
  • C++ new/delete相關知識點詳細解析

    C++ new/delete相關知識點詳細解析

    C語言用一堆標準庫函數(shù)malloc和free在自由存儲區(qū)中分配存儲空間,而C++則用new和delete表達式實現(xiàn)相同的功能
    2013-09-09
  • C語言?模擬實現(xiàn)memcpy與memmove函數(shù)詳解

    C語言?模擬實現(xiàn)memcpy與memmove函數(shù)詳解

    這篇文章主要介紹了C語言詳解如何模擬內存函數(shù),用到了mencpy與memmove兩個函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-04-04
  • C++、Qt分別讀寫xml文件的方法實例

    C++、Qt分別讀寫xml文件的方法實例

    Qt提供了QDomElement 類用于完成對xml文件的讀取和寫入,這篇文章主要給大家介紹了關于C++、Qt分別讀寫xml文件的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • C++實現(xiàn)大數(shù)乘法算法代碼

    C++實現(xiàn)大數(shù)乘法算法代碼

    這篇文章主要介紹了C++實現(xiàn)大數(shù)乘法算法代碼的相關資料,需要的朋友可以參考下
    2015-03-03

最新評論