gpt4 book ai didi

c++ - C++ 析构函数的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:03 28 4
gpt4 key购买 nike

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

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

这个小程序只需从命令行运行即可瞬间执行。但是在调试器中运行时,它需要超过 8 秒。暂停调试器表明它正在销毁所有这些 vector 。什么鬼?

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

添加:为了澄清,不,我没有混淆调试和发布版本。这些结果在同一个 .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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com