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

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

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

first

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

#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é)果如下, 報錯了,告訴我執(zhí)行了2次free函數(shù),也就是重復(fù)釋放了;這是怎么回事呢? 我明明有做判空啊;

free(): double free detected in tcache 2

Process finished with exit code 134

原因

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

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

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

main pPointer:f22d1fb0
release pPointer:f22d1f98

free(): double free detected in tcache 2

Process finished with exit code 134

所以,他們的時間線如下:

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

解決

方案一 :使用指針引用

將release函數(shù)的參數(shù)改為指針引用,如下,注意看,*后面多了個&符號,其他代碼無需改動

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

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

main pPointer:c12d0580
release pPointer:c12d0580

Process finished with exit code 0

方案二:使用二級指針

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

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);
    // 釋放 - 需要加上取地址符號
    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ù)釋放問題解決的文章就介紹到這了,更多相關(guān)c++指針傳遞導(dǎo)致重復(fù)釋放內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

    C語言之平衡二叉樹詳解

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

    EasyC++單獨編譯

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

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

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

    c++重載運算符時返回值為類的對象或者返回對象的引用問題

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

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

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

    C語言直接插入排序算法

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

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

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

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

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

最新評論

甘肃省| 孟州市| 景东| 衡山县| 宝兴县| 儋州市| 普安县| 安福县| 保定市| 武胜县| 沿河| 南平市| 渭源县| 兴文县| 井陉县| 澄迈县| 荔波县| 刚察县| 福清市| 宁陵县| 五华县| 乌审旗| 法库县| 上饶市| 淮安市| 焦作市| 永修县| 宿迁市| 富锦市| 闵行区| 青冈县| 东乡| 九龙城区| 招远市| 长宁县| 应城市| 巴里| 南安市| 凤阳县| 洛浦县| 剑阁县|