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

c++指針傳遞導(dǎo)致的重復(fù)釋放問(wèn)題解決

 更新時(shí)間:2026年05月19日 09:52:21   作者:java葉新東  
本文主要介紹了c++指針傳遞導(dǎo)致的重復(fù)釋放問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

first

先看這段代碼,有多個(gè)地方都會(huì)釋放 pPointer 的對(duì)象空間,但是為了防止重復(fù)釋放,在第二次釋放時(shí)做了判空處理;不為空才釋放;

#include <iostream>
using namespace std;

// 釋放內(nèi)存
void release(int *pPointer){
    delete pPointer;
    pPointer = nullptr;
}

int main() {
    int *pPointer = new int();
    // 釋放
    release(pPointer);

    if(pPointer) delete pPointer;
    return 0;
}

執(zhí)行結(jié)果如下, 報(bào)錯(cuò)了,告訴我執(zhí)行了2次free函數(shù),也就是重復(fù)釋放了;這是怎么回事呢? 我明明有做判空?。?/p>

free(): double free detected in tcache 2

Process finished with exit code 134

原因

原來(lái);在調(diào)用release函數(shù)時(shí),傳入的指針變量,實(shí)際是經(jīng)過(guò)了拷貝的;不信是吧,我們來(lái)做個(gè)實(shí)驗(yàn),在main函數(shù)和release函數(shù)都打印下 pPointer 對(duì)象的地址,代碼如下

void release(int *pPointer){
    printf("release pPointer:%x\n",&pPointer); // 打印pPointer指針對(duì)象的地址
    delete pPointer;
    pPointer = nullptr;
}
int main() {
    int *pPointer = new int();
    printf("main pPointer:%x\n",&pPointer); // // 打印pPointer指針對(duì)象的地址
    // 釋放
    release(pPointer);
	if(pPointer)delete pPointer;
    return 0;
}

執(zhí)行結(jié)果如下, 可以看到 2個(gè)指針地址是不同的,這也就證明了,在傳參的過(guò)程中是發(fā)生了拷貝的;release 函數(shù)中的 pPointer 對(duì)象和main函數(shù)中的 pPointer 對(duì)象并不是同一個(gè)對(duì)象,只是他們都指向了同一塊內(nèi)存。

main pPointer:f22d1fb0
release pPointer:f22d1f98

free(): double free detected in tcache 2

Process finished with exit code 134

所以,他們的時(shí)間線如下:

  1. 在 release 函數(shù)內(nèi)釋放 pPointer, 并將 pPointer 賦值為 nullptr,此時(shí),pPointer 所指向的內(nèi)存塊已經(jīng)被釋放,
  2. 但是只是將 release 函數(shù)內(nèi)的 pPointer 變量賦值為 nullptr,main函數(shù)中 pPointer 還是指向原來(lái)的地址;因?yàn)橹羔樦赶虻膬?nèi)存塊已被釋放,此時(shí) main 函數(shù)中 pPointer 就是個(gè)野指針;
  3. 當(dāng)指執(zhí)行到 if(pPointer) delete pPointer; 代碼時(shí),pPointer 并不是空指針 nullptr ,它還指向原來(lái)的地址,所以判斷if(pPointer)的結(jié)果為真(true),然后會(huì)執(zhí)行 delete pPointer; ,但是原來(lái)地址的空間已經(jīng)在release函數(shù)釋放了,執(zhí)行 delete pPointer; 后就會(huì)報(bào)錯(cuò):double free detected in tcache 2;

解決

方案一 :使用指針引用

將release函數(shù)的參數(shù)改為指針引用,如下,注意看,*后面多了個(gè)&符號(hào),其他代碼無(wú)需改動(dòng)

void release(int *& pPointer){
    delete pPointer;
    pPointer = nullptr;
}

再次執(zhí)行后,就不會(huì)報(bào)錯(cuò)了, 且main函數(shù)和release函數(shù)的 pPointer 對(duì)象地址也是相同的

main pPointer:c12d0580
release pPointer:c12d0580

Process finished with exit code 0

方案二:使用二級(jí)指針

將release函數(shù)的參數(shù)改為二級(jí)指針,也能解決問(wèn)題,如下

void release(int **pPointer){
    printf("release pPointer:%x\n",pPointer);
    delete *pPointer; // 這里需要解引用
    *pPointer = nullptr; // 這里需要解引用
}
int main() {
    int *pPointer = new int();
    printf("main pPointer:%x\n",&pPointer);
    // 釋放 - 需要加上取地址符號(hào)
    release(&pPointer);

    if(pPointer)delete pPointer;

    return 0;
}

執(zhí)行后結(jié)果如下

main pPointer:d2699950

release pPointer:d2699950

Process finished with exit code 0

到此這篇關(guān)于c++指針傳遞導(dǎo)致的重復(fù)釋放問(wèn)題解決的文章就介紹到這了,更多相關(guān)c++指針傳遞導(dǎo)致重復(fù)釋放內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++基礎(chǔ)入門教程(一):基礎(chǔ)知識(shí)大雜燴

    C++基礎(chǔ)入門教程(一):基礎(chǔ)知識(shí)大雜燴

    這篇文章主要介紹了C++基礎(chǔ)入門教程(一):基礎(chǔ)知識(shí)大雜燴,本文講解了注釋、頭文件、命名空間等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • Qt中讀取csv文件的三種主要方法

    Qt中讀取csv文件的三種主要方法

    本文介紹了在Qt中讀取CSV文件的三種主要方法:基礎(chǔ)方法(QFile+QTextStream)、模型法(QStandardItemModel)和數(shù)據(jù)庫(kù)法(QSqlDatabase),基礎(chǔ)方法適合直接處理數(shù)據(jù),模型法便于界面展示,數(shù)據(jù)庫(kù)法則適用于復(fù)雜查詢,文章提供了詳細(xì)的代碼示例,需要的朋友可以參考下
    2026-01-01
  • C語(yǔ)言之平衡二叉樹詳解

    C語(yǔ)言之平衡二叉樹詳解

    平衡二叉樹是具有平衡屬性的有序二叉樹,本文主要介紹了C語(yǔ)言中的平衡二叉樹,具有一定的參考價(jià)值,需要的小伙伴可以參考閱讀
    2023-04-04
  • EasyC++單獨(dú)編譯

    EasyC++單獨(dú)編譯

    這篇文章主要介紹了EasyC++單獨(dú)編譯,在上一篇當(dāng)中,我們編寫好了頭文件coordin.h,現(xiàn)在我們要完成它的實(shí)現(xiàn)。需要的小伙伴可以先學(xué)習(xí)上一篇內(nèi)容然后一起與小編一起進(jìn)入本篇內(nèi)容一起學(xué)習(xí)吧
    2021-12-12
  • Cocos2d-x保存用戶游戲數(shù)據(jù)CCUserDefault類使用實(shí)例

    Cocos2d-x保存用戶游戲數(shù)據(jù)CCUserDefault類使用實(shí)例

    這篇文章主要介紹了Cocos2d-x保存用戶游戲數(shù)據(jù)CCUserDefault類使用實(shí)例,需要的朋友可以參考下
    2014-09-09
  • c++重載運(yùn)算符時(shí)返回值為類的對(duì)象或者返回對(duì)象的引用問(wèn)題

    c++重載運(yùn)算符時(shí)返回值為類的對(duì)象或者返回對(duì)象的引用問(wèn)題

    這篇文章主要介紹了c++重載運(yùn)算符時(shí)返回值為類的對(duì)象或者返回對(duì)象的引用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 深入淺析c/c++ 中的static關(guān)鍵字

    深入淺析c/c++ 中的static關(guān)鍵字

    C++的static有兩種用法:面向過(guò)程程序設(shè)計(jì)中的static和面向?qū)ο蟪绦蛟O(shè)計(jì)中的static。本文重點(diǎn)給大家介紹c/c++ 中的static關(guān)鍵字,感興趣的朋友跟隨小編一起看看吧
    2018-08-08
  • C語(yǔ)言直接插入排序算法

    C語(yǔ)言直接插入排序算法

    大家好,本篇文章主要講的是C語(yǔ)言直接插入排序算法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼

    復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼

    復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • 手把手帶你學(xué)習(xí)C++的運(yùn)算符

    手把手帶你學(xué)習(xí)C++的運(yùn)算符

    這篇文章主要為大家介紹了C++運(yùn)算符,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助,希望能夠給你帶來(lái)幫助
    2021-11-11

最新評(píng)論

专栏| 福泉市| 阜南县| 湄潭县| 屏边| 泰宁县| 五华县| 宁安市| 永胜县| 揭东县| 丹凤县| 金溪县| 东源县| 攀枝花市| 磐石市| 翼城县| 宁安市| 崇文区| 镶黄旗| 晋中市| 湟中县| 宁远县| 若尔盖县| 基隆市| 灵武市| 通渭县| 丹寨县| 句容市| 乡城县| 淮安市| 盐源县| 额尔古纳市| 盐亭县| 安泽县| 天水市| 临高县| 宁晋县| 南丰县| 改则县| 祁门县| 枣庄市|