none
Direct2Dプログラムでメモリリークが発生します RRS feed

  • 質問

  • Direct2Dを使用して、文字や直線を描画するプログラムを作成中です。開発環境はVisual Studio community 2017です。プログラムをデバッグ実行すると、Visual Studioの画面右側に「プロセスメモリ」の推移が表示され、17MBくらいから、10秒に1MBくらいずつ「プロセスメモリ」が増えていきます。これっていわゆる「メモリリーク」なのでしょうか。

    「メモリリーク」が発生しないようにしたいのですが、ソースプログラムのどこが問題なのかわかりません。

    下記にソースプログラムの関連部分を示します。このうち、bool Render( )から関数SetFont(20, L"MS 明朝")を呼び出すとメモリリークが発生します。SetFont()を呼び出さなければ、メモリリークは発生しません。ここまでは調べたのですが、関数SetFont(…)のどこが問題なのかわかりません。

    メモリリークの対策についてご教示いただきたく、よろしくお願いします。

    当方はまだDirect2D初心者です。

    //ウィンドウに追加するデータ

    typedef struct WINDOW_DATA

    {

            ID2D1Factory *d2d1Factory;

            ID2D1HwndRenderTarget * renderTarget;

            ID2D1SolidColorBrush * brush;

    } WindowData;

    //    Grobal Variables.

    HWND window;

    IDWriteFactory* pWriteFactory_;

    IDWriteTextFormat* pFom = NULL;

    WindowData *g_data;

    //Direct2D ファクトリを生成

    bool CreateFactory() {

            HRESULT hr;

            hr = DWriteCreateFactory(

                    DWRITE_FACTORY_TYPE_SHARED,

                    __uuidof(IDWriteFactory),

                    reinterpret_cast<IUnknown**>(&pWriteFactory_)

            );

            //失敗時はメッセージBOXを表示

            if (!SUCCEEDED(hr))

            {

                    MessageBox(NULL, "DWriteCreateFactory()に失敗", NULL, NULL);

                    return false;

            }

            else

                    return true;

    }

    // フォント設定サブルーチン

    void SetFont(int size, const WCHAR* type) {

            pWriteFactory_->CreateTextFormat(

    type ,          // フォント(MS P明朝/MS Pゴシックとか)

                    NULL,           // フォントコレクション(NULL=システムフォント)

                    DWRITE_FONT_WEIGHT_NORMAL,        //太さ

                    DWRITE_FONT_STYLE_NORMAL,         //スタイル(傾き)

                    DWRITE_FONT_STRETCH_NORMAL,       //

                    (float)size ,                    //文字の大きさ

                    L"ja-jp",                       //ロケール(地域)/ja-jp/en-us

                    &pFom

            );

    }

    bool Render(WindowData *data )

    {

            //---------- 文字の描画 -------------------

            //Direct2D ファクトリを生成

            if (!CreateFactory())

                    return false;

            SetFont(20, L"MS 明朝");

            g_data = data;   // グローバル変数に値を設定

            //TextWrite( 200, 30, L"Direct2D サインカーブ", _Blue );

            pWriteFactory_->Release();

            return true;

    }



    • 編集済み fghck856 2017年3月24日 6:35
    2017年3月24日 6:34

回答

  • SetFontの呼び出しが2回目以降の時、それまでpFomに入っていたオブジェクトのReleaseがされていないように見受けられますが。
    • 回答としてマーク fghck856 2017年3月24日 7:00
    2017年3月24日 6:38

すべての返信

  • SetFontの呼び出しが2回目以降の時、それまでpFomに入っていたオブジェクトのReleaseがされていないように見受けられますが。
    • 回答としてマーク fghck856 2017年3月24日 7:00
    2017年3月24日 6:38
  • Hongliang様

    早速のご回答ありがとうございます。bool Render(WindowData *data )関数の中の、 pWriteFactory_->Release();の後にpFom->Release();を追加したところ、メモリリークはなくなりました。本当にありがとうございました。



    • 編集済み fghck856 2017年3月24日 7:05
    2017年3月24日 7:05