报错的位置
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.