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

C++?內存泄漏調試方式

 更新時間:2022年04月29日 09:06:31   作者:決戰(zhàn)北京城  
這篇文章主要介紹了C++?內存泄漏調試方式,C++和其他高級語言不同,需要自行管理內存,項目大調用多,下文我們就來看看C++?內存泄漏調試方式分享,需要的小伙伴可以參考一下

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

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

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

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 已觸發(fā)了一個斷點。
  • 第一次申請 [0000015E95077CD0:0000015E950780D0]  釋放失敗
  • 第二次申請[0000015E951577D0:0000015E95157BD0]   釋放成功
  • 第三次申請[0000015E950E4AA0:0000015E950E4EA0]  釋放成功

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

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

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

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

到此這篇關于C++ 內存泄漏調試方式的文章就介紹到這了,更多相關C++ 內存泄漏內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言例題講解指針與數組

    C語言例題講解指針與數組

    在C語言和C++等語言中,數組元素全為指針變量的數組稱為指針數組,指針數組中的元素都必須具有相同的存儲類型、指向相同數據類型的指針變量。指針數組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-07-07
  • Qt QStandardItemModel用法小結

    Qt QStandardItemModel用法小結

    QStandardItemModel可用作標準Qt數據類型的存儲庫,本文主要介紹了Qt QStandardItemModel用法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • C++設計模式之組合模式(Composite)

    C++設計模式之組合模式(Composite)

    這篇文章主要為大家詳細介紹了C++設計模式之組合模式Composite,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • C++?Boost?Spirit精通教程

    C++?Boost?Spirit精通教程

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • 深入解析C++中的mutable關鍵字

    深入解析C++中的mutable關鍵字

    在C++中,mutable也是為了突破const的限制而設置的。被mutable修飾的變量,將永遠處于可變的狀態(tài),即使在一個const函數中
    2013-10-10
  • C語言冒泡排序法的實現(升序排序法)

    C語言冒泡排序法的實現(升序排序法)

    這篇文章主要介紹了C語言冒泡排序法的實現(升序排序法),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • OpenCV獲取鼠標左鍵點擊位置圖像的像素值

    OpenCV獲取鼠標左鍵點擊位置圖像的像素值

    這篇文章主要為大家詳細介紹了OpenCV獲取鼠標左鍵點擊位置圖像的像素值,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 一篇文章帶你用C語言玩轉結構體

    一篇文章帶你用C語言玩轉結構體

    本文主要介紹C語言 結構體的知識,學習C語言肯定需要學習結構體,這里詳細說明了結構體并附示例代碼,供大家參考學習,有需要的小伙伴可以參考下
    2021-09-09
  • 詳解C語言編程中的函數指針以及函數回調

    詳解C語言編程中的函數指針以及函數回調

    這篇文章主要介紹了C語言編程中的函數指針以及函數回調,函數回調實際上就是讓函數指針作函數參數、調用時傳入函數地址,需要的朋友可以參考下
    2016-04-04
  • C語言中大小端問題實例探索解決方法

    C語言中大小端問題實例探索解決方法

    這篇文章主要介紹了C語言中大小端問題實例,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路
    2023-02-02

最新評論