Vil*_*lx- 5 c++ debugging destructor visual-studio-2008
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector< vector<int> > dp(50000, vector<int>(4, -1));
cout << dp.size();
}
Run Code Online (Sandbox Code Playgroud)
只需从命令行运行,这个小程序只需要一秒钟即可执行.但是在调试器中运行时,需要8秒钟.暂停调试器会发现它正在摧毁所有这些向量.WTF?
注 - Visual Studio 2008 SP1,Core 2 Duo 6700 CPU,带2GB RAM.
补充:澄清一下,不,我不会混淆Debug和Release版本.这些结果是在同一个.exe上,甚至没有任何重新编译.事实上,在Debug和Release版本之间切换没有任何改变.
Ian*_*n G 18
在调试器中运行会将内存分配库更改为执行更多检查的内存分配库.除了内存分配和解除分配之外什么都不做的程序将比"正常"程序遭受更多的痛苦.
编辑 刚刚尝试在VS下运行程序我得到一个看起来像的调用堆栈
ntdll.dll!_RtlpValidateHeapEntry@12() + 0x117 bytes
ntdll.dll!_RtlDebugFreeHeap@12() + 0x97 bytes
ntdll.dll!_RtlFreeHeapSlowly@12() + 0x228bf bytes
ntdll.dll!_RtlFreeHeap@12() + 0x17646 bytes
msvcr90d.dll!_free_base(void * pBlock=0x0061f6e8) Line 109 + 0x13 bytes
msvcr90d.dll!_free_dbg_nolock(void * pUserData=0x0061f708, int nBlockUse=1)
msvcr90d.dll!_free_dbg(void * pUserData=0x0061f708, int nBlockUse=1)
msvcr90d.dll!operator delete(void * pUserData=0x0061f708)
desc.exe!std::allocator<int>::deallocate(int * _Ptr=0x0061f708, unsigned int __formal=4)
desc.exe!std::vector<int,std::allocator<int> >::_Tidy() Line 1134 C++
Run Code Online (Sandbox Code Playgroud)
其中显示了ntdll.dll中的调试功能以及正在使用的C运行时.