1

タイトルが示唆しているように、私は別の理論上の質問があります。それはコードのビルドを評価することです。基本的に、このテンプレートをどこでも使用することを検討しています。

VC ++ VS2008を使用しています(すべて含まれています)

Stapel.h

class Stapel
{
public:
    //local vars
    int x;

private:
public:
    Stapel();
    Stapel(int value);
    ~Stapel(){}

    //getters setters
    void set_x(int value)
    {
        x = value;
    }

    int get_x(int value)
    {   
        x = value;
    }   

void CleanUp();

private:
};

Stapel.cpp

#include "Stapel.h"

Stapel::Stapel()
{

}

Stapel::Stapel(int value)
{
    set_x(value);
}

void Stapel::CleanUp()
{
    //CleanUpCalls
}

ここでの焦点はクリーンアップメソッドです。基本的には、そのメソッドをすべてのファイルに配置し、必要に応じて削除呼び出しを実行して、すべてが1つの場所にあることを確認し、削除が飛び交うのを防ぐことができます。ルーキーとして、私でさえ、あなたがいじりたくないものでも、ずさんなヒープを持っているものでもないかもしれません。

このビルドはどうですか?

良し悪し ?なぜ ?

そして、そのようなタスクにデストラクタを使用するのはどうですか?

4

2 に答える 2

8

Boost は、 RAIIスタイルのヒープ管理用にいくつかのユーティリティを提供します。

  1. スマート ポインター(ここにはさまざまなシナリオでいくつかの実装があります)
  2. ポインター コンテナー

あなたの提案の欠点:

  1. CleanUp実装では、実行するすべてのヒープ割り当てに対して -method に削除を配置することを忘れないでください。プログラムに何らかの種類の非線形制御フローがある場合、これらの割り当てを追跡することは非常に困難になる可能性があります (一部の割り当ては特定の状況でのみ発生する可能性があります)。リソース (この場合はメモリ) の割り当て解除をスタック上のオブジェクトの有効期間にバインドすることで、それほど心配する必要はありません。循環参照などを考慮する必要があります。
  2. RAII は、例外セーフコードを作成するのに役立ちます。
  3. 私の経験では、RAII はより構造化されたコードにつながります。特定のループまたはブランチ内でのみ必要なオブジェクトは、他の場所では初期化されませんが、必要なブロック内で初期化されます。これにより、コードが読みやすくなり、維持しやすくなります。

編集:実装を開始する良い方法は、Boostを取得することです。次に、コードで生のポインターを検索し、すべてのポインターを

  1. 参照
  2. スマートポインター
  3. ポインターを所有するコンテナーの場合は、ポインター コンテナー

これが完了すると、コードにdeletes が含まれなくなります。make_sharedを使用すると、すべてnewの を削除することもできます。自分で解決できない問題に遭遇した場合は、stackoverflow.comをチェックしてください...ああ、待ってください、あなたはすでにそれを知っています;)

于 2010-09-06T08:15:16.737 に答える
7

代わりに、スマート ポインターと RAII を使用してください。これにより、すべてdeleteの が 1 か所に集中するのではなく、コードから削除されます。自分でクリーンアップを実行する必要がある場合、それがデストラクタの目的であり、それがC++の規則であるため、それらを使用します。

于 2010-09-06T08:15:06.503 に答える