cdc::createcompatibledc CDC的三种使用方式:获得、创建与临时对象,你知道吗?

网安智编 厦门萤点网络科技 2025-08-17 00:04 102 0
1:CDC方面: CDC有三种使用方式 一种是获得,包括GETDC和,这种CDC是引用,使用完了一定要,不释放就会这个引用过来的CDC资源泄漏,千万不能用,会导致报错或程序崩溃。 还有一种就是创建,一般是,等,这是创建一个新的DC,使用完了...

1:CDC方面:

CDC有三种使用方式

一种是获得,包括GETDC和,这种CDC是引用,使用完了一定要,不释放就会这个引用过来的CDC资源泄漏,千万不能用,会导致报错或程序崩溃。

还有一种就是创建,一般是,等,这是创建一个新的DC,使用完了要,如果是NEW的还需要。如果不是指针,而是一个CDC对象(CDC _dc;),那在使用后也可以不,因为CDC对象的析构函数会调用。

最后一种是临时的CDC对象,(CDC* pDC = CDC::(->hDC);),这种CDC在我们重载控件的函数中经常用到,这类CDC是由系统在空闲时自动释放(没有测试过是否可以手动释放,有兴趣的朋友可以自己试试)。

2:下面说下GDI对象

我的帖子举例的情况是不会造成内存泄漏的,返回的指针是一个临时对象的指针,这个指针是保存在系统的一个MAP里的,对于MAP里的不使用的对象,系统会在空闲时自动释放。

那个例子的结果就是,把新的图片放到了那个CDC里面,CDC里面的默认或是原来的图片被替换删除了,再想用的时候就没有了。举例

pDC->("11");

pDC->(&cpen);

pDC->("22");

cpen一个粗线条的笔,正常的想法是11是系统默认粗细的笔,22是粗线条,因为你没有选回系统默认的CPEN( pDC->(  );),当你第二次执行这段代码的时候,11和22都是粗线条的,因为默认的笔已经被你改变了。

3:举例一:

void ::( CDC* pDC )

 bmp;

* ;

bmp.();

 = pDC->( &bmp );

if( () ){

pDC->(  );

CDC使用方式_cdc::createcompatibledc_GDI对象内存泄漏

此段代码最大的问题就是在第一个语句,如果在这种情况下,就执行选回原来的画刷,导致资源不释放,

4:举例二:

::(CDC* pDC, CWnd* pWnd, UINT )

hbr = ::(pDC, pWnd, );

// TODO:  在此更改 DC 的任何属性

pDC->();

B=(RGB(204,204,255));

()B;

// TODO:  如果默认的不是所需画笔,则返回另一个画笔

hbr;

此段代码主要是修改对话框以及控件的背景颜色,但是长时间运行将会发现大量资源泄漏。原因是每次进入此函数都会创建新的 B而此对象有作为此函数的返回,即资源不会得到释放,