中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++內存泄漏調試方式是什么

發布時間:2022-04-29 13:39:45 來源:億速云 閱讀:291 作者:zzz 欄目:開發技術

這篇文章主要介紹“C++內存泄漏調試方式是什么”,在日常操作中,相信很多人在C++內存泄漏調試方式是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++內存泄漏調試方式是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

C++和其他高級語言不同,需要自行管理內存,項目大\調用多,容易內存泄漏.內存申請釋放使用malloc/freenew delete兩種方式.

當內存報錯彈出一個陌生的地址,我一臉懵逼,不清楚是哪個地方出的錯,特別是程序退出的時候報錯更不好定位.可以使用第三方工具來定位解決,也可以自己想辦法解決.

我在做神經網絡訓練的時候碰到一個的BUG,發送完訓練圖片之后直接提示使用了非法內存.

HEAP[Test.exe]: HEAP: Free Heap block 0000015E950E4A60 modified at 0000015E950E4AA0 after it was freed.

代碼迭代了多次,部分功能沒有測試,也不清楚哪里出的問題.

聯想到內存的申請釋放方式,申請和釋放總是配對的,申請的大小也是預先知道的.在內存申請申請釋放的時候加上內存地址打印,當內存泄漏報錯的時候就可以定位出錯內存地址在哪個范圍.我加入了一個內存打印函數,把內存地址范圍和時間都打印出來.

void DebugHeap(CString name, void * ptr,int size)
{
    long Time = GetCurrentTime();
    TRACE("========>heap name:%s,address [%p:%p],time:%d (ms)\n", name,ptr,(char *)ptr + size,Time);
}

在程序中申請\釋放部分加入DebugHeap

static Neural * mThis;
static FileInfo mFileInfo;
Neural *Neural:: GetInstance(MainDlg * parent,DlgCommand * cmd)
{
    if (mThis == NULL)
    {
        mThis = new Neural(parent);
        mCmd = cmd;
    }
    return mThis;
}
 
void Neural:: ReleaseInstance()
{
    if (mThis != NULL)
        delete mThis;
}
 
Neural::Neural(MainDlg * parent)
{
    mFileInfo.mRcv = (unsigned char *)malloc(1024);
    DebugHeap("flag1:alloc", mFileInfo.mRcv, 1024);
}
 
Neural::~Neural(void)
{
    bWork = FALSE;
    DebugHeap("flag1:free ", mFileInfo.mRcv, 1024);
    free(mFileInfo.mRcv);
}

程序運行中的日志:

==>  ThreadRecvProc Start
==>  ThreadInterrupt Start
MainDlg::OnInitDialog()
========>heap name:flag1:alloc,address [0000015E95077CD0:0000015E950780D0],time:7870921 (ms)
“Test.exe”(Win32): 已加載“C:\Windows\System32\clbcatq.dll”。無法查找或打開 PDB 文件。
“Test.exe”(Win32): 已加載“C:\Windows\System32\edputil.dll”。無法查找或打開 PDB 文件。
....
線程 0x2a10 已退出,返回值為 0 (0x0)。
線程 0x2ae4 已退出,返回值為 0 (0x0)。
“Test.exe”(Win32): 已加載“C:\Windows\System32\mswsock.dll”。無法查找或打開 PDB 文件。
連接服務器成功!
線程 0x16c8 已退出,返回值為 96 (0x60)。
線程 0xa0c 已退出,返回值為 0 (0x0)。
“Test.exe”(Win32): 已加載“C:\Windows\System32\msctfuimanager.dll”。無法查找或打開 PDB 文件。
....
========>heap name:flag1:alloc,address [0000015E951577D0:0000015E95157BD0],time:7885500 (ms)
Ending:43707
========>heap name:flag1:free ,address [0000015E951577D0:0000015E95157BD0],time:7885609 (ms)
線程 0x2f20 已退出,返回值為 0 (0x0)。
========>heap name:flag1:alloc,address [0000015E950E4AA0:0000015E950E4EA0],time:7887265 (ms)
analyse:3, D:\數據\FSSD\V5\target.csv
========>heap name:flag1:free ,address [0000015E950E4AA0:0000015E950E4EA0],time:7887296 (ms)
線程 0x2a00 已退出,返回值為 0 (0x0)。
線程 0xe84 已退出,返回值為 0 (0x0)。
HEAP[Test.exe]: HEAP: Free Heap block 0000015E950E4A60 modified at 0000015E950E4AA0 after it was freed
Test.exe 已觸發了一個斷點。
  • 第一次申請 [0000015E95077CD0:0000015E950780D0]  釋放失敗

  • 第二次申請[0000015E951577D0:0000015E95157BD0]   釋放成功

  • 第三次申請[0000015E950E4AA0:0000015E950E4EA0]  釋放成功

從報錯的意思看是重復釋放內存.0000015E950E4AA0 地址被重復釋放,這個地址剛好是第三次申請的地址.

看現象是第一次申請的地址被改動了,查看這部分代碼分析原因.

按照我預想在構造函數申請內存,析構函數釋放內存,是能配對.代碼里加入單例模式并且使用了一個全局變量mFileInfo,隨著構造函數調用會不斷改變.我預想是這個類只能單例使用,由于歷史原因,部分代碼并沒有使用單例模式.單例中的申請的地址位置被改動了,所以沒辦法正確釋放.統一使用單例模式,這個問題解決了.

C++出現內存錯誤時候,把申請/釋放的地址打印出來能更快更準確的定位到問題.

到此,關于“C++內存泄漏調試方式是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

南靖县| 达孜县| 娱乐| 新营市| 广西| 贡嘎县| 礼泉县| 鹰潭市| 图们市| 中山市| 鹿邑县| 湘西| 瑞金市| 伊宁市| 新安县| 阿拉尔市| 湘潭县| 锡林浩特市| 邛崃市| 彰化县| 定州市| 万载县| 临武县| 蒲江县| 乌苏市| 定西市| 江华| 美姑县| 布尔津县| 宣武区| 新营市| 淳化县| 龙门县| 龙岩市| 博乐市| 宣威市| 扶沟县| 达尔| 民丰县| 濮阳县| 神池县|