none
不存在内存碎片, 不存在内存不够用的情况下std::bad_alloc -- ERROR_CODE: (NTSTATUS) 0xe06d7363 RRS feed

  • 问题

  • 系统: 64位 2008 server 

    程序: 32位

    编译环境: vs2005 C++

    在内存很小, 虚拟内存50+MB的情况下, 报出std::bad_alloc异常.

    通过windbg查看, getlasterror() == 0x57(参数不正确)     NTSTATUS == 0xe06d7363(c++异常)

    错误代码:

    004B90E2  add         esp,4 
    004B90E5  push        100000h 
    004B90EA  call        operator new[] (60BB2Fh) 
    004B90EF  add         esp,4 

    不存在内存碎片, 不存在内存不够用的情况下,  申请4M内存失败.

    从论坛中搜索 可能错误是: Invalid or corrupt installation of .Net 2.0 Framework.  

    但是我的程序非托管, 是VS2005 C++编译的exe程序.

    这是为什么, 会产生std::bad_alloc异常...

    FAULTING_IP: 
    KERNELBASE!RaiseException+58
    74edc6e3 c9              leave

    EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
    ExceptionAddress: 74edc6e3 (KERNELBASE!RaiseException+0x00000058)
       ExceptionCode: e06d7363 (C++ EH exception)
      ExceptionFlags: 00000001
    NumberParameters: 3
       Parameter[0]: 19930520
       Parameter[1]: 0f65fd9c
       Parameter[2]: 00693278

    2013年1月7日 2:25

全部回复

  • 最好能找到 std::bad_alloc 发生在你的哪行代码上。

    有可能的原因是:

    1,系统确实不够分配4MB的内存。关于这点,你可以在你的程序出现 std::bad_alloc 的时候,用一个简单的 malloc 程序来测试一下;

    2,有可能你用int来计算出一个大小,结果溢出变成了一个负数或特别大的值,导致 malloc 失败;

    3,你的其它代码有BUG;

    2013年1月7日 2:35
  • 1. 内存够用的.

    2. 004B90E5  push        100000h 
    004B90EA  call        operator new[] (60BB2Fh) 

     代码看出, 应该不会是复数

    3. 只有在64位系统下才会发生上面的事情...  在32位系统上, 运行正常...

    2013年1月7日 2:41
  • 我假设你对1,2的判断都是正确的,那么请在你自己的代码中找问题。

    你可以在 std::bad_alloc 发生时,紧接着你的代码调用 malloc 一个较小的内存块,可以采用逐级递减的方式来。 

    2013年1月7日 3:04
  • 看看能不能重现... 现在由于只有一个dmp文件...

    这个大约要5-6个小时出现一次...

    2013年1月7日 3:20
  • 我假设你对1,2的判断都是正确的,那么请在你自己的代码中找问题。

    你可以在 std::bad_alloc 发生时,紧接着你的代码调用 malloc 一个较小的内存块,可以采用逐级递减的方式来。 

    还有没其他方法呢?  我猜测跟32位的虚拟环境有关系.  我的程序的32位的, 在64位机器上运行... 在其他32位程序上运行, 一切OK的...
    2013年1月7日 3:22
  • 我假设你对1,2的判断都是正确的,那么请在你自己的代码中找问题。

    你可以在 std::bad_alloc 发生时,紧接着你的代码调用 malloc 一个较小的内存块,可以采用逐级递减的方式来。 

    还有没其他方法呢?  我猜测跟32位的虚拟环境有关系.  我的程序的32位的, 在64位机器上运行... 在其他32位程序上运行, 一切OK的...

    排除1,2问题后,如果是跟32位或64位相关,那么一定就是你的代码中有不严谨的地方。这需要结合你的代码来调试,没有通用解决方案,如果有通用解决方案,那就不用提问了,在KB里一查就出来了。
    2013年1月7日 5:14
  • 有dmp文件,你有pdb文件吗,可以还原一下堆栈。看一下是什么问题。另外你可以观察一下内存是否有内存泄漏,应该还是代码的问题。里面应该有内存的错误。

    麻烦把正确答案设为解答。

    2013年1月8日 6:07
    版主
  • 有dmp文件,你有pdb文件吗,可以还原一下堆栈。看一下是什么问题。另外你可以观察一下内存是否有内存泄漏,应该还是代码的问题。里面应该有内存的错误。

    麻烦把正确答案设为解答。

    堆栈:

    KERNELBASE!RaiseException+0x58
    Ess!_CxxThrowException+0x46 [f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp @ 161]
    Ess!operator new+0x69 [f:\dd\vctools\crt_bld\self_x86\crt\src\new.cpp @ 63]

    错误信息:

    getlasterror() == 0x57(参数不正确)     NTSTATUS == 0xe06d7363(c++异常)

    出错代码:

    004B90E2  add         esp,4 
    004B90E5  push        100000h 
    004B90EA  call        operator new[] (60BB2Fh) 
    004B90EF  add         esp,4 

    2013年1月8日 7:01