0

プロジェクトに抽象工場設計パターンを使用しています。

CPattern * CObjectA::Create(void)
{
    CPattern *p = new CPattern;
    patternList.push_back (p);
    return *p;
}

//Member variable
CPattern *pat = NULL;

pat = Obj.Create();

CObjectA は、デストラクタ中に割り当てられた領域を削除します。問題は、クライアントがこれをもう一度行う場合です。

pat = Obj.Create();

別のスペースを割り当てて、それにポイントを当てます。これが数百回呼び出されると、割り当てを解除せずにスペースを作成し続けます。

別のスペースを割り当てる前に pat が空かどうかを確認する方法はありますか?

ご協力ありがとうございました!

4

2 に答える 2

2
delete pat;
pat = Obj.Create();

より良い解決策はpat、新しいオブジェクトに再割り当てしたときにオブジェクトを自動的に削除するスマート ポインターを作成することです。

patternList最新の状態に保つことは、まったく別の問題です。

于 2012-09-28T01:16:01.817 に答える
0

あなたのコードは一貫していません:Create関数は参照を返しますが、ポインターを返す必要があります (あなたの later で暗示されているようにpat = Obj.Create();)。(ファクトリは、参照渡しではなくポインターを自然に返します。後者は、基本型のローカル変数への偶発的なコピーを助長するためです。スライシングと呼ばれるもので、実際の実行時の型に固有のデータ メンバーはコピーされません)

「CObjectA は、デストラクタ中に割り当てられたスペースを削除します」 - true ですが、ヒープに割り当てられたオブジェクトの場合はdelete、デストラクタをトリガーする必要があります。「クライアント」は、delete置換する前に次のことを確認する必要がありpatます。

delete pat;  // does nothing if pat's already NULL...
pat = new CObjectA.Create();
于 2012-09-28T01:18:14.843 に答える