error C2660: “Gdiplus::GdiplusBase::operator new”: 函数不接受 3 个参数

原创 2017年03月29日 09:45:28

有三种解决办法,前两种网上很多,也一并贴出来。

问题原因:

在调试版本中 MFC 定义扩展到带有两个额外的参数的重载  运算符的 new 运算符的预处理器宏。额外的参数是源文件名称和代码行号。MFC 可以使用此信息对程序员在调试模式下时报告内存泄漏。这适用于 MFC 类因为 MFC 提供的  接受额外的参数的重载的不同而不同。
但是,此扩展由预处理器来完成,因为它会影响所有使用 new 运算符。如果在项目中使用了任何非 MFC 类,其 new 运算符是也即使没有合适的重载, 的可用在该类中扩展。这是发生在 GDI + 中,如此一来,您收到一个编译时错误消息。


解决方法:

一、注释掉以下行在源文件中的代码关闭预处理器扩展:

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

: 此方法具有不使用的缺点在 MFC 中功能的信息,这些功能可帮助您跟踪内存分配和泄漏。


二、GDI + 使用重载为提供  的和 删除 运算符通过编写一些代码,可接受,并丢弃其他参数。您可以将下面的代码演示了这种方法,粘贴到一个新的头文件,并包括新的头文件,而不是 Gdiplus.h 文件。

//// Ensure that GdiPlus header files work properly with MFC DEBUG_NEW and STL header files.


#define iterator _iterator


#ifdef _DEBUG


namespace Gdiplus
{
namespace DllExports
{
#include <GdiplusMem.h>
};


#ifndef _GDIPLUSBASE_H
#define _GDIPLUSBASE_H
class GdiplusBase
{
public:
void (operator delete)(void* in_pVoid)
{
DllExports::GdipFree(in_pVoid);
}


void* (operator new)(size_t in_size)
{
return DllExports::GdipAlloc(in_size);
}


void (operator delete[])(void* in_pVoid)
{
DllExports::GdipFree(in_pVoid);
}


void* (operator new[])(size_t in_size)
{
return DllExports::GdipAlloc(in_size);
}


void * (operator new)(size_t nSize, LPCSTR lpszFileName, int nLine)
{
return DllExports::GdipAlloc(nSize);
}


void operator delete(void* p, LPCSTR lpszFileName, int nLine)
{
DllExports::GdipFree(p);
}


};
#endif // #ifndef _GDIPLUSBASE_H
}
#endif // #ifdef _DEBUG


#include <gdiplus.h>
#undef iterator
//// Ensure that Gdiplus.lib is linked.
#pragma comment(lib, "gdiplus.lib")


三、所有创建GDI+对象的new方法改成::new。如 Bitmap *pImg = new Bitmap(...) 改成 Bitmap *pImg = ::new Bitmap(...)。


版权声明:本文为博主原创文章,未经博主允许不得转载。

error C2660: 'Gdiplus::GdiplusBase::operator new' : function does not take 3 parameters

http://support.microsoft.com/kb/317799 
  • oldmtn
  • oldmtn
  • 2011年06月07日 22:26
  • 1250

vtkcallbackcommand.h(46): error C2660: “vtkObjectBase::operator new”: 函数不接受 3 个参数

ca
  • Q1302182594
  • Q1302182594
  • 2014年06月10日 11:14
  • 1375

Gdiplus::GdiplusBase::operator new 函数不接受3 个参数"问题的处理

遇到这样的问题令我极为郁闷,于是查找了一下,找到了解决方案:原来是微软的 DEBUG_NEW 和 GDI+ 不匹配造成的。 方法1: 注释掉: #ifdef _DEBUG #define n...
  • shuilan0066
  • shuilan0066
  • 2016年12月29日 10:50
  • 622

error C2660: “Gdiplus::GdiplusBase::operator new”: 函数不接受 3 个参数

//#ifdef _DEBUG //#define new DEBUG_NEW //#endif 将上面三行注释掉就可以编译通过。...
  • wushuang443
  • wushuang443
  • 2015年06月26日 15:00
  • 986

error C2660: 'Gdiplus::GdiplusBase::operator new'

 今天编译一个使用 GDI+ 的程序,报错说error C2660: “Gdiplus::GdiplusBase::operator new”: 函数不接受 3 个参数挺纳闷。找到解决方案,原来是微软...
  • DavidHsing
  • DavidHsing
  • 2008年05月12日 10:02
  • 2804

operator new 函数不接受 3 个参数(错误及修正方法)

问题一般由宏定义_DEBUG引起。
  • ronggenmiao
  • ronggenmiao
  • 2014年06月25日 13:53
  • 924

error C2660: “MessageBoxA” : 函数不接受 1 个参数

MessageBox函数的区别: 一个参数的MessageBox是MFC封装Win SDK的,只能在对话框里面进行调用; 例如:MessageBox( "pGRAY 空间申请失败"...
  • shujun19941226
  • shujun19941226
  • 2016年04月01日 11:22
  • 790

错误 1 error C2660: 函数不接受 10 个参数

使用如下语句: if(m_ComPort.AsynSendData(pTransDate,pSummary,pCurrency,pType,pEndDate,pDeposit,pAccess,pBa...
  • b2292486308
  • b2292486308
  • 2016年12月20日 14:23
  • 629

【error C2660: “GetDlgItem”: 函数不接受 1 个参数】

MFC编程时,遇到如下错误: error C2660: “GetDlgItem”: 函数不接受 1 个参数 (1)、CWindow::GetDlgItem 函数原型:HWND...
  • u013634684
  • u013634684
  • 2015年10月20日 10:48
  • 3114

CWnd::NotifyWinEvent 函数不接受 4 个参数的解决方案

error C2039: “NotifyWinEvent”: 不是“`global namespace'”的成员error C2039: “NotifyWinEvent”: 不是“`global na...
  • jhgameboy
  • jhgameboy
  • 2014年04月18日 14:44
  • 2838
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:error C2660: “Gdiplus::GdiplusBase::operator new”: 函数不接受 3 个参数
举报原因:
原因补充:

(最多只允许输入30个字)