写了个DLL, 在一个函数中使用了calloc 和 free 进行指针分配(确认只用了一个指针), debug版本没问题, release版本直接出来问题了。 本人用的4级警告, 所有代码其他地方都无警告。 另外, 指针是进行了检测后使用的。
下面详细描述问题, 类似于这样:type func()
{
ptr = calloc(...);
...; // 检测ptr是否为NULL
...; // 使用ptr的逻辑代码
free( ptr );return typeData;
}完毕。有出现过 access volatile 0x5的情况, 但不可能, 原因看后面。
Release版运行出错后, 直接转调试, 然后调试指示错误开始是 free(), 后面总是指向 calloc()。 如果说Release版本也许会调整相对的代码结构, 我在这段calloc之前和之后都加了一个打印一句话的代码, 但之后的语句还未打印出来就弹出问题框了。
然后看到out中显示 Unhandled exception at 0x76ed33bb (ntdll.dll) in Test.exe: 0xC0000374: A heap has been corrupted.接着后面一些显示 torlent 的等英文, 但现在已经显示不出来了, 我查阅了下, 据说是与win7中的新技术 容错堆有关。总结, 已经确认是 calloc的执行代码出了问题。 也许与我的执行代码有关, 求解。我现在无解了。 求高人来解决问题。 还有说明下, win7用的是ultimate, 但没升级过SP1的包, 不知道是否与这有关, 然后VS 2010 仅升级过一次修复包, 那还是很久以前的事情了。
下面详细描述问题, 类似于这样:type func()
{
ptr = calloc(...);
...; // 检测ptr是否为NULL
...; // 使用ptr的逻辑代码
free( ptr );return typeData;
}完毕。有出现过 access volatile 0x5的情况, 但不可能, 原因看后面。
Release版运行出错后, 直接转调试, 然后调试指示错误开始是 free(), 后面总是指向 calloc()。 如果说Release版本也许会调整相对的代码结构, 我在这段calloc之前和之后都加了一个打印一句话的代码, 但之后的语句还未打印出来就弹出问题框了。
然后看到out中显示 Unhandled exception at 0x76ed33bb (ntdll.dll) in Test.exe: 0xC0000374: A heap has been corrupted.接着后面一些显示 torlent 的等英文, 但现在已经显示不出来了, 我查阅了下, 据说是与win7中的新技术 容错堆有关。总结, 已经确认是 calloc的执行代码出了问题。 也许与我的执行代码有关, 求解。我现在无解了。 求高人来解决问题。 还有说明下, win7用的是ultimate, 但没升级过SP1的包, 不知道是否与这有关, 然后VS 2010 仅升级过一次修复包, 那还是很久以前的事情了。
解决方案 »
- 数组不能赋值?是函数模板下对数组元素赋值,编译没问题,输出是随机数
- listcontrol如何显示每行的索引?
- 在对话框某个区域画图
- YufengShi(浪子) ,请你帮忙。
- 有没有公司要人,csdn的兄弟们帮忙看看(偶有两年多的产品开发和设计经验,现在在北京)
- 请帮忙,在改程序中关于csocket的怪问题,先谢了!
- 关于安全的参数传递:如何在窗口之间传递参数?
- "multiple default constructors specified" 编译warning,有什么办法可以解决?
- Cstring类型怎么比较MFC
- 能否给我说说啥是回调(CallBack)函数?
- 模拟淘宝登录,网址中有个参数不知道是怎么回事?
- Win32中用什么函数给不是封闭图像填充背景色?
...; // 检测ptr是否为NULL//屏蔽...; // 使用ptr的逻辑代码//释放
if(ptr)
{
free( ptr );
ptr = NULL;
}
debug对这种操作有一定的保护措施
release没有
就是上面那种情况啊, 如果是free操作出现这种问题, 我都觉得正常了, 但偏偏是calloc出现的。
屏蔽后还是弹出 问题。 不过代码上我与你的有些不同, 就是 直接free(ptr), 没有if()之类的(另外加个ptr = NULL还多了一条指令, 因为只在这一函数中使用ptr, 且还是在函数尾进行释放的, 所以可以看得很清楚)这不存在问题, calloc成功返回对应地址, 失败返回NULL。 free对于NULL是忽略的。
ptr = calloc(...);// 详细点
calloc( num, size );
你的意思是说: 我可能将 num设为负数, size的数值特别大的这个可能吗? 这个, 我在程序逻辑上检查了下, 觉得没有可能。 如果说要调试的话, 现在我的程序没有出现错误了。 具体看我在第10楼的回复。