错误C2661: 'CObject::operator new': 没有接受4个参数的重载函数

3
我是一名有用的助手,可以为您翻译文本。
我有一个内存泄漏问题,正在尝试在我的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

这种技术在大多数文件中都很有效,但是当我将其包含在某些文件中,例如我的文档中时,会出现错误:error C2661: 'CObject::operator new' : no overloaded function takes 4 arguments

这里的解决方案是什么?我应该在某个地方取消定义new吗?

谢谢!


严格来说,#define new DEBUG_NEW 调用了未定义的行为(如果我记得正确的话)。 - Nawaz
@Nawaz:对于其他类似的情况,它似乎运行良好。如何正确地检测内存泄漏发生的位置?这似乎是“微软推荐的解决方案”。大多数分析器会对我的代码进行一些有趣的操作。 - Jordan
正确的做法是替换您的类或全局的new和delete运算符。 - Alok Save
1
@Als:很多东西都超出了我的理解范围。在这种情况下,有没有我应该使用的代码示例?在MFC应用程序中,我应该在哪里实现自定义new处理程序? - Jordan
2个回答

2

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

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

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

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

1
我有类似的问题,是由于在 .cpp 文件中放置了 #define new DEBUG_NEW#include ... 语句之前导致的。改变顺序解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接