最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

Lambda介紹

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

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

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

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

這就非常奇怪。shared_ptr計數(shù)是線程安全的,(但是實際指向?qū)ο蠛陀嫈?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被析構(gòu)后,B注冊的回調(diào)被另一個線程調(diào)用了func();這時可能會出現(xiàn)A開始析構(gòu),剛好析構(gòu)到B,并且B的sptrMap已經(jīng)析構(gòu)時,出現(xiàn)崩潰。但這個順序不是確定的無法保證,所以也不一定必出現(xiàn)這種現(xiàn)象。

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

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

另附實際代碼

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();
}

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

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

相關(guān)文章

  • C語言中無符號與有符號及相加問題

    C語言中無符號與有符號及相加問題

    這篇文章主要介紹了C語言中無符號與有符號及相加問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • 基于C語言實現(xiàn)簡單的12306火車售票系統(tǒng)

    基于C語言實現(xiàn)簡單的12306火車售票系統(tǒng)

    火車售票系統(tǒng)給我們的出行帶來了極大的方面,那么他基于編程是如何實現(xiàn)的呢?今天小編抽時間給大家分享一個使用C語言寫的一個簡單的火車票系統(tǒng),感興趣的朋友參考下
    2016-09-09
  • C++設(shè)計模式之享元模式

    C++設(shè)計模式之享元模式

    這篇文章主要介紹了C++設(shè)計模式之享元模式,本文講解了什么是享元模式、享元模式代碼實例、享元模式的優(yōu)點等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 深入理解C++之策略模式

    深入理解C++之策略模式

    下面小編就為大家?guī)硪黄钊肜斫釩++之策略模式。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • C語言實現(xiàn)簡單學生學籍管理系統(tǒng)

    C語言實現(xiàn)簡單學生學籍管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單學生學籍管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++掃雷游戲的簡單制作

    C++掃雷游戲的簡單制作

    這篇文章主要為大家詳細介紹了C++掃雷游戲的簡單制作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言中fchdir()函數(shù)和rewinddir()函數(shù)的使用詳解

    C語言中fchdir()函數(shù)和rewinddir()函數(shù)的使用詳解

    這篇文章主要介紹了C語言中fchdir()函數(shù)和rewinddir()函數(shù)的使用詳解,是C語言入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言實現(xiàn)掃雷小游戲的示例代碼

    C語言實現(xiàn)掃雷小游戲的示例代碼

    這篇文中主要為大家詳細介紹了如何利用C語言實現(xiàn)經(jīng)典的掃雷小游戲。掃雷小游戲主要是利用字符數(shù)組、循環(huán)語句和函數(shù)實現(xiàn),感興趣的小伙伴可以了解一下
    2022-10-10
  • OpenCV實現(xiàn)高斯噪聲

    OpenCV實現(xiàn)高斯噪聲

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)高斯噪聲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++ 自由存儲區(qū)是否等價于堆你知道嗎

    C++ 自由存儲區(qū)是否等價于堆你知道嗎

    自由存儲是C++中通過new與delete動態(tài)分配和釋放對象的抽象概念,而堆(heap)是C語言和操作系統(tǒng)的術(shù)語,是操作系統(tǒng)維護的一塊動態(tài)分配內(nèi)存
    2021-08-08

最新評論

石渠县| 剑川县| 邵东县| 白城市| 保靖县| 定南县| 屯昌县| 罗平县| 汉阴县| 廊坊市| 东乌珠穆沁旗| 漾濞| 当阳市| 巴楚县| 凤城市| 新宁县| 贺兰县| 本溪市| 普安县| 合江县| 谷城县| 平武县| 潼南县| 临夏市| 三门峡市| 沾化县| 依兰县| 太和县| 鹤峰县| 繁昌县| 松滋市| 和平区| 厦门市| 兴和县| 长顺县| 天水市| 土默特右旗| 淮滨县| 青阳县| 高雄县| 新龙县|