首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++析构函数的怪异行为

C++析构函数的怪异行为
EN

Stack Overflow用户
提问于 2009-02-10 12:21:10
回答 8查看 3.1K关注 0票数 5
代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

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

当简单地从命令行运行时,这个小程序需要一秒时间来执行。但是在调试器中运行时,需要超过8秒。暂停调试器显示它正在销毁所有这些向量。见鬼?

注: 2008 SP1,Core2Duo6700CPU,2GB内存。

补充道:为了澄清,不,我没有混淆调试和发布版本。这些结果都在同一个.exe上,甚至不需要在中间重新编译。事实上,在Debug和Release之间的切换不会改变什么。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-02-10 12:25:35

在调试器中运行会将内存分配库更改为执行更多检查的库。一个只做内存分配和去分配的程序将遭受比“正常”程序更多的痛苦。

编辑刚刚尝试在VS下运行您的程序,我得到了一个类似于

代码语言:javascript
复制
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运行时。

票数 18
EN

Stack Overflow用户

发布于 2009-02-11 03:05:12

在调试器中启动程序时,调试堆将自动启用,而不是使用调试器附加到已经运行的程序。

由Mario和Daniel撰写的“http://www.advancedwindowsdebugging.com/”一书提供了一些关于Windows堆的不错信息,事实证明,关于堆的章节是在网站上作为一个示例章节

第281页有一个关于“附加与启动调试器下的进程”的侧边栏:

在调试器下启动进程时,堆管理器将修改所有创建新堆的请求,并更改堆创建标志以启用调试友好型堆(除非_NO_DEBUG_HEAP环境变量设置为1)。相比之下,附加到已经运行的进程上,进程中的堆已经使用默认堆创建标志创建了,并且不会设置调试友好标志(除非应用程序显式设置)。

(还有:半相关的问题,我之前在这里发布了部分答案。)

票数 4
EN

Stack Overflow用户

发布于 2009-02-10 12:23:02

运行带有调试器的程序总是比不运行的要慢。

这必须由VS连接到新的/delete调用并在附加时执行更多检查引起--或者运行时库使用IsDebuggerPresent API并在这种情况下执行不同的操作。

您可以在Visual中轻松地尝试这一点,使用Debug->Start调试或Debug->Start无需调试启动程序。没有调试就像命令行一样,具有完全相同的构建配置和可执行文件。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/532092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档