GDI+编程中的一条错误信息及其原因分析

本文分析了在MFC编程中使用GDI+时遇到的"error C2660: 'new' : function does not take 3 parameters"错误,原因是DEBUG_NEW宏与GDI+类中重载的operator new不兼容。解决方案是为GdiplusBase类添加DEBUG_NEW所需的重载函数。
摘要由CSDN通过智能技术生成
公司不让用盗版,遂准备逐一将各软件要么换成开源的,要么就自己写,看了看,就数Acdsee最简单了(有些高级功能根本用不着),行,从这个入手吧。
需求分析:基本的图片查看功能,图片格式转换功能,基本的图形变换功能。
技术可行性分析:MS提供的GDI +已经提供了比较专业的图形显示、格式转换功能,而且简单易用。
....

OK,就绪,开始干吧。

但是在程序编写的过程中,有条错误信息让我很不解。程序中有如下语句:
bmPhoto  =  new Bitmap ( THUMBNAIL_WIDTH , THUMBNAIL_HEIGHT , PixelFormat24bppRGB  );
每次DEBUG编译的时候总是报告如下的错误:
error C2660 :  'new'  : function does  not take  3 parameters
开始以为是Bitmap的构造函数的问题,但是查了一下,Bitmap明明有个构造函数:
Bitmap (IN INT width ,
       IN INT height ,
       IN PixelFormat format  = PixelFormat32bppARGB );
那会是什么问题呢?上网讨论了一下,最终将问题锁定在MFC程序中的这样一个宏定义上:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static  char THIS_FILE [] = __FILE__ ;
#endif
这几行从来都不会引起我们注意的代码有什么问题呢 ?为什么会使得我们的代码报告如上所述的编译错误呢 ?
让我们来看看DEBUG_NEW的定义(在afx .h中):
#if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT)

// Memory tracking allocation
void * AFX_CDECL  operator new (size_t nSize , LPCSTR lpszFileName ,  int nLine );
#define DEBUG_NEW new(THIS_FILE, __LINE__)
#if _MSC_VER >= 1200
void AFX_CDECL  operator delete ( void * p , LPCSTR lpszFileName ,  int nLine );
#endif
看到这里你可能会想, new被define成了DEBUG_NEW,而后者又被define成了 new (...),这不是成了个循环 ?非也。由于afx .h早于任何其它头文件被包含 (stdafx .h包含afxwin .h,afxwin .h又包含了afx .h,而MFC要求我们在任何有效代码之前包含stdafx .h,当然,这不是必须的 ),所以DEBUG_NEW的定义早于后面的#define  new DEBUG_NEW,也就是说这个define只对后面的代码有效,对前面已经include了的afx .h中的代码是无效的。

上面只是题外话,现在回到正题。
MFC重载 operator new,是为了方便定位内存泄漏,重载后的 operator new会记录下所分配的每块内存对应的__FILE__和__LINE__信息。一般来讲,标准的 operator new的声明如下:
void
 *__cdecl  operator new (size_t );
即它只有一个参数,只接收一个size信息。我们的如下代码
int
* pi  =  new  int ;  // the same as int* pi = new int(); or int* pi = new int[1];
等价于
int
* tpi  = ( int *) operator new ( sizeof ( int ));  // attention: this line cannot pass compilation if you have define DEBUG_NEW
int * pi  = tpi ;
同理,定义DEBUG_NEW前,文章开头报错的这条语句:
Bitmap * bmPhoto  =  new Bitmap ( THUMBNAIL_WIDTH , THUMBNAIL_HEIGHT , PixelFormat24bppRGB  );
等价于
Bitmap * tbmPhoto  = (Bitmap *) operator new
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值