写了个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 仅升级过一次修复包, 那还是很久以前的事情了。

解决方案 »

  1.   

    照理说不可能时CRT的问题,你是在什么情况下calloc的,这段代码的是在什么情况下运行的
      

  2.   

    是不是访问越界了, 屏蔽中间的代码试试看ptr = calloc(...);
    ...; // 检测ptr是否为NULL//屏蔽...; // 使用ptr的逻辑代码//释放
    if(ptr)
    {
      free( ptr );
      ptr = NULL;
    }
      

  3.   

    应该是你在使用的时候有越界行为
    debug对这种操作有一定的保护措施
    release没有
      

  4.   

    When the application is linked with a debug version of the C run-time libraries, calloc resolves to _calloc_dbg.
      

  5.   


    就是上面那种情况啊, 如果是free操作出现这种问题, 我都觉得正常了, 但偏偏是calloc出现的。
      

  6.   


    屏蔽后还是弹出 问题。 不过代码上我与你的有些不同, 就是 直接free(ptr), 没有if()之类的(另外加个ptr = NULL还多了一条指令, 因为只在这一函数中使用ptr, 且还是在函数尾进行释放的, 所以可以看得很清楚)这不存在问题, calloc成功返回对应地址, 失败返回NULL。 free对于NULL是忽略的。
      

  7.   

    你使用ptr的代码中有修改指针的指向吗?
      

  8.   

    "debug版本没问题, release版本直接出来问题了。"
    ptr = calloc(...);//  详细点
      

  9.   


    calloc( num, size );
    你的意思是说: 我可能将 num设为负数, size的数值特别大的这个可能吗? 这个, 我在程序逻辑上检查了下, 觉得没有可能。 如果说要调试的话, 现在我的程序没有出现错误了。 具体看我在第10楼的回复。