報錯的位置
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釋放也是錯誤的!
這里指的是,這樣做邏輯上是錯誤的;
非常可能會出錯,並不是說一定會出錯;
但是不養成配對使用的習慣,很容易出錯!!!!
參考文章