3

タスク マネージャーを使用して、次のコードに GDI リークがあることに気付きました。このコードを実行するプロセスの GDI オブジェクトの数は、実行するたびに 1 ずつ増加しますが、問題が見つからないようです。

どんな助けでも大歓迎です。

// create new DC based on current    
HDC hDC = CreateCompatibleDC(GetDC());
// select a bitmap into the new DC and keep the old one
HGDIOBJ hOldObj = SelectObject (hDC,hBM);
// do somthing here --> 100% no leak here
SomeFunction (hDC);
// select the old object back from whence it came and delete whats returned   
DeleteObject (SelectObject (hDC,hOldObj));
// delete the DC
DeleteDC(hDC);
// delete the tmp object
DeleteObject (hOldObj);

RM

4

7 に答える 7

6

コメントからコピーして、テストできないので答えとして入れませんでした。正しいかどうかわかりませんでした。テストしてください。

一般に、ネストされた呼び出しを使用することはお勧めできません。

HDC hDC1 = GetDC(); 
HDC hDC2 = CreateCompatibleDC(hDC1); 
.. 

それ以外の

HDC hDC = CreateCompatibleDC(GetDC()); 

(コード内のBTWで、GetDCによって返されるHDCはリリースされません。)

于 2009-01-27T02:39:19.003 に答える
4

から返されたハンドルではReleaseDCないことを確認してください。DeleteDCGetDC

于 2009-01-27T02:22:20.660 に答える
1

リークを見つけて修正するように deleaker にアドバイスできます。

于 2011-11-17T16:58:50.153 に答える
0

この質問はすでに答えられていると思います。飛び込んで、GDIオブジェクトで使用できるさまざまなスマートポインタークラスとラッパーをお勧めします。

MFCには、CDCやCMemoryDCなどのさまざまなGDI関連オブジェクトがあります。不要になったときに正しい削除を実行します。

于 2009-01-27T04:56:59.380 に答える
0

ペツォルドを読む。GetDC() は実際にはベースです。

于 2009-01-27T17:20:23.903 に答える
0

最後の行で hOldObj を削除しないでください

DeleteObject (hOldObj);

于 2009-01-27T17:26:24.250 に答える
0

(私がこれを言おうとしていたとき、既に回答付きのコメントがあることに気付きました - クレジットは xhantt に送られます)

最初の行で GetDC() によって作成された dc が解放されるとは思わない。

于 2009-01-27T02:16:55.430 に答える