0

Direct2d を使用する場合、次の関数が存在します。

HRESULT WINAPI D2D1CreateFactory(
  _In_      D2D1_FACTORY_TYPE factoryType,
  _In_      REFIID riid,
  _In_opt_  const D2D1_FACTORY_OPTIONS *pFactoryOptions,
  _Out_     void **ppIFactory
);

上記のメソッドが戻ると、ppIFactory には新しいファクトリへのポインタへのアドレスが含まれているため、このファクトリを使用できます。

同様のことをしたかったので、MessageLog.h に次のように記述しました。

void CreateMessageLog(MessageLog**);

class MessageLog{
public:
    void PutToLog(WCHAR[]);

    WCHAR* GetLog();
    int GetLogLenght();
    int GetnLogLines();

private:
    WCHAR logHistory[MaxLogSize];
    int nLogLines;
};

そして、これを MessageLog.cpp に:

void CreateMessageLog(MessageLog** ppMessageLog)
{
    MessageLog mLog;
    MessageLog* pmLog=&mLog;
    ppMessageLog=&pmLog;
}

これが完了したので、いくつかの問題があります。まず、CreateMessageLog 関数が終了すると、作成された MessageLog オブジェクトはスコープ外になり、ポインタは NULL になりますよね? この問題の解決策は何ですか?

ところで、私の CreateMessageLog 関数は期待どおりの動作をしないと思います。また、その問題の解決策は何ですか?ありがとう。

4

2 に答える 2

1

ダイナミック アロケーションを使用する:

MessageLog* CreateMessageLog()
{
    return new MessageLog;
}

関数の内側でdelete作成されたポインターを外側に記憶します。newポインタが指すメモリには、必要なときにいつでもアクセスできます。完了したら、次のように呼び出してメモリを手動で解放する必要がありますdelete a

例:

MessageLog* a = createMessageLog();
// use `a` the way you want
// when done:
delete a;

MessageLogオブジェクトが大きくない場合は、コピーを作成することもできます。効率が悪くても、自分でメモリを管理する必要はありません。

MessageLog CreateMessageLog()
{
    MessageLog a;
    return a;
}

PS: コピー コンストラクターが使用可能であることを確認してください。

于 2013-03-16T16:01:35.460 に答える
1

このように書くと

void CreateMessageLog(MessageLog** ppMessageLog)
{
    MessageLog mLog;
    MessageLog* pmLog=&mLog;
    ppMessageLog=&pmLog;
}

MessaLog はスタック上に作成され、関数スコープを持ちます。CreateMessageLog を離れるとすぐに存在しなくなります。

代わりにヒープを使用して MessageLog を作成します

void CreateMessageLog(MessageLog** ppMessageLog)
{
    MessageLog* mLog = new MessageLog;
    *ppMessageLog=pmLog;
}

必要がなくなったら、割り当てられたヒープを削除することを忘れないでください。

于 2013-03-16T16:14:40.973 に答える