【问题标题】:Visual C++ CRT debuggingVisual C++ CRT 调试
【发布时间】:2012-09-02 10:36:08
【问题描述】:

当我开始使用here 讨论的调试时遇到了一个非常严重的链接器错误。

我设法将其缩小到 new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ) 构造。一旦使用了新运算符的重载,我就会得到error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (??3@YAXPEAXHPEBDH@Z) already defined in ...

如果我从链接过程中排除该对象文件,它只会将我指向另一个。我还没有验证这一点,但我很确定他们所有这些与 MFC 冲突的目标文件都使用了调试新版本的操作符。

这让我大吃一惊,因为如果你用谷歌搜索这个错误,所有的证据都会告诉你,你以错误的顺序混合了 CRT 和 MFC 的东西,果然,这就是我在做的事情。

我用dumpbin /directives 浏览了我所有的目标文件和库,并确保链接的顺序是正确的,尽管如此,我从未克服过那个错误。

CRT 调试技术是否天生与 MFC 不兼容,或者对此有什么解释?

我对 MFC 不是很了解,我正在尝试完全摆脱 MFC,但我希望它能够正常工作,直到发生这种情况。

【问题讨论】:

  • 我尝试使用 CRT 的东西两次来检测内存泄漏,但没有成功。我会推荐你​​自己的包装或绕道而行。或者使用其中一种内存管理工具。
  • 您能否发布整个链接器错误消息?
  • @john 当然……如果有帮助的话。我更新了问题以包含完整的错误,我只剥离了对象和文件名。
  • @john,您是否在小样本上尝试过相同的 CRT 函数集?
  • @KirillKobelev 不,我最终花了一整天的时间,之后我将整个项目从 VC2008 转移到 VC2010,但没有成功。 Atm,我不能花更多时间调试这个,我真的希望有更多知识和经验的人告诉我链接器过程是怎么回事......

标签: c++ mfc msvcrt


【解决方案1】:

MFC 应用程序将在调试模式下为您检测内存泄漏。要获取有关泄漏的更多信息,您可以在每个文件的顶部将 new 定义为 DEBUG_NEW,如下所示:

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

有关详细信息,请参阅 MSDN 文章Memory Leak Detection in MFC

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 2010-10-15
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多