free 一個指針時【 retval = HeapFree(_crtheap, 0, pBlock);】報錯的原因


 

報錯的位置

void __cdecl _free_base (void * pBlock)
{

        int retval = 0;


        if (pBlock == NULL)
            return;

        RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));

       retval = HeapFree(_crtheap, 0, pBlock);//最后一個箭頭指到這兒,蛋疼!!!
        if (retval == 0)
        {
            errno = _get_errno_from_oserr(GetLastError());
        }
}

 

解決方案:

方案1

在運行結束后報錯,基本都是內存釋放的問題!

釋放了一個指針,這個指針所指的內存,不是用malloc等內存管理函數分配的內存。
查看一下那個指針是啥東西。

是否已經施行過加減運算,或者干脆就是隨便拿過來的一個數值,
或者一個不用釋放的指針(指向局部變量的指針,指向全局變量的指針),
甚至是野指針。

方案2

C,C++ 兼容的分配釋放堆內存的函數:
malloc,realloc 
free 
凡是malloc 分配成功的內存,一定要用free釋放,這個只要求,內存地址不變就行,分配的指針的值是多少,釋放是就必須還是多少。

C++專用:
由於C++分配和釋放內存的運算符new delete會分別調用構造函數,析構函數;
所以要求必須配對使用,並且 指針類型和指針的值,delete 的必須和 new的相同,不然就“有可能”不爭取

分配單個對象用 new, delete

class A{....}; 
A *pa=new A;//這里使用的是new 運算符!!
......          //這些代碼,不可以改動pa的值
delete pa;    //使用的是delete 運算符!!改動后這個釋放就錯了!

分配對象數組用 new[],delete[];例如

class A{....}; 
A *pa=new A[10];//這里使用的是new[]運算符!!
......          //這些代碼,不可以改動pa的值
delete []pa;    //使用的是delete[]運算符!!改動后這個釋放就錯了!

ew分配的用free釋放 是錯誤的,同樣,malloc 分配的用delete釋放也是錯誤的!

這里指的是,這樣做邏輯上是錯誤的;
非常可能會出錯,並不是說一定會出錯;

但是不養成配對使用的習慣,很容易出錯!!!!

 

 

 

參考文章

1. 在程序運行結束后(系統自動回收堆空間時報錯)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM