【问题标题】:error C2661: 'CObject::operator new' : no overloaded function takes 4 arguments错误 C2661:“CObject::operator new”:没有重载函数需要 4 个参数
【发布时间】:2012-06-12 17:48:56
【问题描述】:

我正在尝试在我的 mfc 程序中查找内存泄漏。通常我会执行以下操作:

头文件

// Leak Detection
#if defined(WIN32) && defined(_DEBUG)
     #define _CRTDBG_MAP_ALLOC
     #include <stdlib.h>
     #include <crtdbg.h>
#endif

cpp 文件

// Leak detection
#if defined(WIN32) && defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC)
    #ifdef DEBUG_NEW 
        #undef DEBUG_NEW
    #endif
    #define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__ )
    #define new DEBUG_NEW
#endif

这种技术在大多数文件中都适用,但是当我将它包含在某些文件(例如我的文档)中时,我收到错误:错误 C2661:'CObject::operator new':没有重载函数需要 4 个参数

这里有什么解决方案?我应该在某个地方#undef-ing 新事物吗?

谢谢!

【问题讨论】:

  • 学究式地讲#define new DEBUG_NEW 调用未定义的行为(如果我没记错的话)。
  • @Nawaz:它似乎适用于其他类。检测内存泄漏实际发生位置的正确方法是什么?这似乎是“微软推荐的解决方案”。大多数分析器都用我的代码做一些有趣的事情。
  • 正确的做法是为您的班级或全局替换 new 和 delete 运算符。
  • @Als:很多事情让我有点不知所措。在这种情况下我应该使用代码示例吗?我将在 mfc 应用程序中的何处实现自定义新处理程序?

标签: c++ memory-leaks mfc compiler-errors memory-leak-detector


【解决方案1】:

我也使用与您相同的功能来进行泄漏检测。

假设您不再需要它来捕获内存泄漏,您可以注释掉或删除 DEBUG_NEW 定义块。或者,如果您仍然需要它,请保持原样并使用

#ifdef _DEBUG
#undef new
    CMyOject* pMyObjectInst = new CMyObject();
#define new DBG_NEW
#endif  

因此,您在对象创建之前取消定义 new(请参阅错误列表中的行号)并在之后立即重新定义它,以便在此对象创建之后发生的任何内存泄漏仍然可以识别。

【讨论】:

    【解决方案2】:

    在 .cpp 文件中将 #define new DEBUG_NEW 放在 #include ... 语句之前会导致类似的问题。更改顺序解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      相关资源
      最近更新 更多