【问题标题】:Visual Studio 2008, detecting mem leaks, the symbol '__FILE__' is not definedVisual Studio 2008,检测内存泄漏,未定义符号“__FILE__”
【发布时间】:2012-04-13 08:32:01
【问题描述】:

我正在尝试识别我的 c++ 程序中的 memleaks。我使用 Visual Studio 2008。

我发现了一些教程,处理在使用 new 而不是 malloc 进行内存分配时识别 memleaks,这是我在 main 之上定义的:

#define __STDC_CONSTANT_MACROS 

#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

不幸的是,我收到大量错误,您可以在此处查看:http://pastebin.com/9ax90VTg

但我想我发现了问题:定义了更近的__FILE____LINE__。当我点击__FILE____LINE__上的“RMB->go to definition”或“RMB->go to declaration”时,我得到:

the symbol '__FILE__' is not defined 

the symbol '__LINE__  ' is not defined 

分别。

我应该如何解决这个问题?

【问题讨论】:

    标签: c++ windows visual-studio-2008 winapi


    【解决方案1】:

    符号__FILE____LINE__ 应始终由编译器定义。如果不是,您必须使用一些特殊选项来禁止它们。

    另一方面,您发布的代码不能与标准库一起使用,因此应避免使用。它不是寻找内存泄漏的好方法。

    编辑:重读您的帖子:您似乎指望调试器向您展示定义;它不能,因为它们是由编译器自动生成的,在编译过程中会发生变化。另一方面,您看到的错误与您的宏以破坏标准库代码的方式重新定义关键字这一事实非常兼容。

    【讨论】:

    • 什么是好的解决方案呢?我需要知道导致泄漏的确切线路或至少方法。
    • @user1331072 最好的解决方案是某种外部工具,例如 valgrind。或者,您可以为全局 operator newoperator delete 编写一个替换(或者至少在实践中,为 mallocfree)。获得堆栈回溯将需要依赖于平台的代码,但通常不会太难。解释起来更复杂:我的operator new/delete 版本只是以十六进制输出返回地址,然后我手动利用这些地址,在进程映射中查找它们。
    【解决方案2】:

    你找错树了。 __FILE____LINE__ 由预处理器处理。他们不应该被定义。您没有向我们展示产生这些错误的实际代码,所以我不确定我们如何为您提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-16
      • 2011-02-18
      • 1970-01-01
      • 2020-04-11
      • 2011-03-27
      • 2015-12-27
      • 1970-01-01
      相关资源
      最近更新 更多