Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试减少C+;调试编译中的内存分配大小+;_C++_Visual Studio 2008_Crt - Fatal编程技术网

C++ 尝试减少C+;调试编译中的内存分配大小+;

C++ 尝试减少C+;调试编译中的内存分配大小+;,c++,visual-studio-2008,crt,C++,Visual Studio 2008,Crt,我有一个在调试模式下编译的软件,以便于支持(获取转储文件等)。Visual studio版本为2008 我们已经注意到,我们的内存分配因此遭受了巨大的开销。定义调试时完成的每个内存分配(即使是单个指针的分配)都带有一个大的头,标识分配的文件、行等 我们试图保持调试状态,同时减少开销。似乎定义_AFX_NO_DEBUG_CRT应该可以做到这一点,但在项目级别或stdafx.h文件中定义它会导致一长串编译错误: c:\ProgramFiles(x86)\microsoft visual studio

我有一个在调试模式下编译的软件,以便于支持(获取转储文件等)。Visual studio版本为2008

我们已经注意到,我们的内存分配因此遭受了巨大的开销。定义调试时完成的每个内存分配(即使是单个指针的分配)都带有一个大的头,标识分配的文件、行等

我们试图保持调试状态,同时减少开销。似乎定义_AFX_NO_DEBUG_CRT应该可以做到这一点,但在项目级别或stdafx.h文件中定义它会导致一长串编译错误:

c:\ProgramFiles(x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtls_uuu.h(66):错误C2059:语法错误:'\uuu asm' c:\program files(x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtls_uuz.h(66):错误C2143:语法错误:缺少“”,在“{”

该错误与以下报告的错误相同:,但创建自己的新文件的要求在此处不相关,我在此处未找到解决方案

我在博文中看到的另一种选择是使用_CrtSetDbgFlag——但这似乎只是为了避免将信息写入堆——但仍然为其分配内存——这不是我们想要的

有什么想法吗

#define _CRTDBG_MAP_ALLOC
从MSDN中,#define语句将CRT堆函数的基本版本映射到相应的调试版本。通过包含crtdbg.h,您可以将malloc和free函数映射到它们的调试版本_malloc_dbg和_free_dbg,它们跟踪内存分配和释放。这是您想要避免的。 此映射仅在调试生成(其中定义了_debug)中发生。发布生成使用普通malloc和free函数

为了达到你的目的, 只需
#未定义(CRTDBG)映射(ALLOC)

转到Visual Studio项目设置->调试设置,转到C/C++预处理器设置,在“取消定义预处理器定义”设置下添加
\u CRTDBG\u MAP\u ALLOC


您应该能够生成一个调试可执行文件,该文件在运行时内存分配期间不会无意中生成。

的可能重复项顺便说一下,我不明白为什么您不能改用版本生成。启用PDB生成(生成调试信息选项)在项目设置中。不要分发PDB文件。这样你就不必担心由于内存分配而被偷听到,在发布版本中一切都优化得很好。谢谢你的提示。至于其他帖子-是的,这是相同的问题,但我没有尝试提供我自己的新建和删除的限制,只是想避免过度使用CRT块的ead-所以我希望可能有人能帮助我(那里的答案都没有提供解决方案)。至于转移到发行版-这是一个巨大的变化,我们正试图避免(因为它将改变许多行为),使调试更加困难。很高兴知道PDB生成选项。我尝试了这个(我找到的定义是在advanced下的)-但我在调试时没有看到内存分配大小或函数的变化。我仍然在里面:void*\uuu cdecl operator new(size\u t nSize,int nType,LPCSTR lpszFileName,int nLine)@RamiJaschek我想关键是要尽早取消定义,并确保之后不定义它-最好的办法是查看预处理的文件。有没有办法在项目级别定义它之前完成这项工作?我尝试在我的Stdafx.h文件中添加它-但没有用。基本上,我是用一个非常简单的vi来测试这项工作的sual studio生成的文件中,我只添加了一个简单的main,用于分配一组对象。我分配的对象只有几个字节,但每次分配大约花费70字节。这是一个非常简单、最小的项目。@RamiJaschek我不确定最早如何做,但当我需要这样的东西时,我将其作为第一行ide
stdafx.h
。完全有可能该符号稍后在您包含的其他一些标题中定义。查看预处理的文件可以帮助定位问题。