C言語入門(18) 様々な所で使われているポインターの意味 (2)

Posted: 2012年12月13日

前回も様々な種類のポインターを説明来ましたが
今回も同じ内容です。

HDC

Windowプログラミングを使用すると
OnPaintメソッドで

PaintDC dc;

CDC* pDc = GetDC();
TextOut(pDc->GetSafeHandle() , 10 , 10 , “あいうえお” , strlen(“あいうえお”));

などに出くわすことがある。
これらは、GDIオブジェクトを確保するため
解放忘れを行うとGDIオブジェクトが増え続けることになります。
※PaintDCはポインタではないためリークの心配はありません。
GDIオブジェクの使用率は、タスクマネージャーから確認することが可能です。
Win32APIを用いる場合は、GDI(Graphics Device Interface)を用いて描画を行います。
他の描画方法としては、DirectXやOpenGL等があります(ゲームなどで使われています)
GDIを使用し続けると描画がおかしくなります。
通常のメモリーリークよりも激しいため
実際にリークさせてみると、いい経験になると思います!!

解放には、

ReleaseDC(pDC);

を使用します。
ReleaseDCはGetDCを実行したスレッドで行う必要があるため
注意して行う必要があります。

HBRUSH

四角など画像を作成する際にブラシを用いて描画をします。
HBRUSHを生成するとGDIオブジェクトが使用されます。

 HBRUSH hBrush;
 hBrush = CreateSolidBrush( RGB(0,0,255) );

こちらも解放が必要です。

 DeleteObject( hBrush );

また、リークの心配がないC#(.Net Framework)でもBrushは
リークするため解放の必要があります
C#の場合は、結構騙されて開放していない場合があります。

またここでは、HBRUSHに気をつけてみたいな書き方ですが
ほかにも同様の動作をします。FontやHPEN等

MSXML2::IXMLDOM???

MSXMLの場合は、分かりやすいですが
作成したら削除する

プログラムプログラム:

 MSXML2::IXMLDOMDocument2Ptr pDoc;
 pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument60) );
 pDoc.Release();

型がPtr型のためあまりポインターらしくはありませんが
ポインターです。
実際に型を見るとIXMLDOMDocument2Ptrはスマートポインタ型のため
自動で解放してくれます。
そのためリークは発生しませんが使用方法ではエラーになることがあります。

プログラムプログラム:

{
    // COMの初期化
    if( FAILED( ::CoInitialize(NULL) ) ) {
        return;
    }
    MSXML2::IXMLDOMDocument2Ptr pDoc;
    pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument60) );

    // 処理

    // COMの後始末
    ::CoUninitialize();
}

この場合ですとpDocが解放されるのは、この{}のあとに解放されますが
CoUninitializeでCOMが解放されているためMSXMLの解放処理に失敗しエラーとなります。
そのためCOMの後始末の前に

 pDoc.Release();

を入れる必要があります。
エラーになるため分かりやすいですがなるべく解放処理を入れたほうが
無駄に悩む時間を使用せずに済みます。

カテゴリー: プログラム, 入門 | タグ: , , , | コメント無し »

コメント