C++ 新[]分配的内存大小

C++ 新[]分配的内存大小,c++,stl,windbg,C++,Stl,Windbg,我正在调查一起车祸,下面有堆栈跟踪 ... 12 4292e2c4 73148e89 KERNELBASE!RaiseException+0x58 13 4292e2fc 73150e7c MSVCR80!_CxxThrowException+0x46 [f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp @ 161] 14 4292e318 386f21ba MSVCR80!operator new+0x69 [f:\dd\vcto

我正在调查一起车祸,下面有堆栈跟踪

...
12 4292e2c4 73148e89 KERNELBASE!RaiseException+0x58
13 4292e2fc 73150e7c MSVCR80!_CxxThrowException+0x46 [f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp @ 161]
14 4292e318 386f21ba MSVCR80!operator new+0x69 [f:\dd\vctools\crt_bld\self_x86\crt\src\new.cpp @ 63]
15 4292e32c 386f1f39 StatEngineProxy!std::allocator<myClass>::allocate+0x1a [c:\program files (x86)\microsoft visual studio 8\vc\include\xmemory @ 146]
16 4292e384 386ef7e8 myModule!std::vector<myClass,std::allocator<myClass> >::_Insert_n+0xf9 [c:\program files (x86)\microsoft visual studio 8\vc\include\vector @ 1138]
17 4292e3b0 386ec20f myModule!std::vector<myClass,std::allocator<myClass> >::insert+0x88 [c:\program files (x86)\microsoft visual studio 8\vc\include\vector @ 855]
18 4292e3dc 3872bb17 myModule!std::vector<myClass,std::allocator<myClass> >::push_back+0xaf [c:\program files (x86)\microsoft visual studio 8\vc\include\vector @ 800]
....
。。。
12 4292e2c4 73148e89内核库!RAISEEException+0x58
13 4292e2fc 73150e7c MSVCR80_CxxThrowException+0x46[f:\dd\vctools\crt\u bld\self\u x86\crt\prebuild\eh\throw.cpp@161]
14 4292e318 386f21ba MSVCR80!运算符new+0x69[f:\dd\vctools\crt\u bld\self\u x86\crt\src\new.cpp@63]
15 4292e32c 386f1f39声明Neproxy!std::allocator::allocate+0x1a[c:\program files(x86)\microsoft visual studio 8\vc\include\xmemory@146]
16 4292e384 386ef7e8我的模块!std::vector::_Insert\u n+0xf9[c:\program files(x86)\microsoft visual studio 8\vc\include\vector@1138]
17 4292e3b0 386ec20f myModule!std::vector::insert+0x88[c:\ProgramFiles(x86)\microsoft visual studio 8\vc\include\vector@855]
18 4292e3dc 3872bb17 myModule!std::vector::push_back+0xaf[c:\program files(x86)\microsoft visual studio 8\vc\include\vector@800]
....

原因很简单:
bad\u alloc
。问题是如何找到stl试图分配的内存量。

向该类中的所有新[]添加
try…catch
,然后在
catch
子句中设置详细的调试信息。

您可以给stl一个自定义分配器,使其所有内存声明都通过您提供的函数进行

这里有一个例子:
简单。你可以得到CRT的来源。(可能在
C:\ProgramFiles\Microsoft Visual Studio 10.0\VC\crt\src\new.cpp
中)。因此,您可以查看第14帧的源和变量


您会发现第58行看起来像
void*\u CRTDECL操作符new(size\u t size)\u THROW1(\u STD bad\u alloc)
。该参数
size
就是您要查找的参数。

来自堆栈跟踪,还是来自您可以调试的系统?您不能将调试器设置为在抛出异常时停止吗?从我可以调试的系统或崩溃转储。我无法轻松复制崩溃。调试器不允许您插入第14帧并查看传递给运算符new的内容吗?如果异常为
错误\u alloc
,则意味着
运算符new
无法满足分配请求,因为没有剩余物理内存或内存碎片。您也不可能从任何特殊调试技术中获得任何附加信息。由于异常发生在
vector::push_back
中,因此提前调用
vector::reserve
可能会解决这两种情况下的问题(碎片更少,使用的中间内存总量更少,并且作为一个额外的好处:复制更少)。但是,operator new没有收到需要分配的大小的参数。这是如何实现的?新的[]是从std::vector调用的。确定std::vector试图增长的源代码点,然后用try…catch子句围绕它们。这可能会提高总体性能,但我敢打赌它不会解决上述问题。自定义分配器将无法更改这样一个事实,即
vector::push_back
需要定期重新分配,同时保留一个副本,该副本仅在以后释放。这会使分配器在以后拥有“mip映射大小”的较小可用内存块,这对于将来的分配是无用的(无论是单独分配还是合计分配都太小)。解决方案实际上是提前
保留
,因此
向量
不需要重新分配。它确实解决了问题,即:请求了多少字节?