help!!! 在程序运行结束后(系统自动回收堆空间时报错)

add1 2013-06-11 10:38:27

//这是报错时系统自动弹出的代码:
/***
*free.c - free an entry in the heap
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* Defines the following functions:
* free() - free a memory block in the heap
*
*******************************************************************************/

#include <cruntime.h>
#include <malloc.h>
#include <winheap.h>
#include <windows.h>
#include <internal.h>
#include <mtdll.h>
#include <dbgint.h>
#include <rtcsup.h>

/***
*void free(pblock) - free a block in the heap
*
*Purpose:
* Free a memory block in the heap.
*
* Special ANSI Requirements:
*
* (1) free(NULL) is benign.
*
*Entry:
* void *pblock - pointer to a memory block in the heap
*
*Return:
* <void>
*
*******************************************************************************/

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());
}
}
...全文
450 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Digital2Slave 2014-06-24
  • 打赏
  • 举报
回复
为什么我用new delete配对使用操作指针,还是提示和楼主一样的错误哈~
lm_whales 2013-06-13
  • 打赏
  • 举报
回复
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[]运算符!!改动后这个释放就错了!
new分配的用free释放 是错误的,同样,malloc 分配的用delete释放也是错误的! 这里指的是,这样做逻辑上是错误的; 非常可能会出错,并不是说一定会出错; 但是不养成配对使用的习惯,很容易出错!!!!
add1 2013-06-13
  • 打赏
  • 举报
回复
引用 3 楼 lm_whales 的回复:
释放了一个指针,这个指针所指的内存,不是用malloc等内存管理函数分配的内存。 查看一下那个指针是啥东西。 是否已经施行过加减运算,或者干脆就是随便拿过来的一个数值, 或者一个不用释放的指针(指向局部变量的指针,指向全局变量的指针), 甚至是野指针。
确实,指针只是new了空间,并没有初始化,memset(ptr,0,100)过后不再报错~~
www_adintr_com 2013-06-11
  • 打赏
  • 举报
回复
报错的位置并不是你出错的位置, 检查下你传进来的参数吧
add1 2013-06-11
  • 打赏
  • 举报
回复
线程 'Win32 线程' (0x1df4) 已退出,返回值为 0 (0x0)。 线程 'Win32 线程' (0x9f4) 已退出,返回值为 0 (0x0)。 线程 'Win32 线程' (0x18e8) 已退出,返回值为 0 (0x0)。 线程 'Win32 线程' (0x14cc) 已退出,返回值为 0 (0x0)。 appLockerCli.exe 中的 0x51b13442 (mfc100d.dll) 处最可能的异常: 0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突 appLockerCli.exe 中的 0x772e15de 处有未经处理的异常: 0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突
quickSort 2013-06-11
  • 打赏
  • 举报
回复
在运行结束后报错,基本都是内存释放的问题!
lm_whales 2013-06-11
  • 打赏
  • 举报
回复
释放了一个指针,这个指针所指的内存,不是用malloc等内存管理函数分配的内存。 查看一下那个指针是啥东西。 是否已经施行过加减运算,或者干脆就是随便拿过来的一个数值, 或者一个不用释放的指针(指向局部变量的指针,指向全局变量的指针), 甚至是野指针。

65,170

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧