析构函数的怪异行为

析构函数的怪异行为

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector< vector<int> > dp(50000, vector<int>(4, -1));
    cout << dp.size();
}

仅从命令行运行时,此微型程序就需要花一秒钟的时间来执行。但是,在调试器中运行时,将花费8秒钟以上的时间。暂停调试器显示它正在破坏所有这些 vector 。 WTF?

注意-Visual Studio 2008 SP1,Core 2 Duo 6700 CPU和2GB RAM。

已添加:为了澄清,不,我不会混淆Debug和Release版本。这些结果在一个相同的.exe上,而在它们之间甚至没有任何重新编译。实际上,在Debug和Release版本之间切换不会改变任何东西。

最佳答案

在调试器中运行会将内存分配库更改为需要更多检查的内存分配库。除了内存分配和取消分配之外什么也不做的程序比“普通”程序要遭受的痛苦要大得多。

编辑
刚刚尝试在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++

其中显示了ntdll.dll中的调试功能以及正在使用的C运行时。

关于c++ - C++析构函数的怪异行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/532092/

10-12 21:13