0

最近、いくつかのオブジェクトが非常に大きくなり、しばらくするとそれらが不要になる可能性があることに気付きました。デストラクタがメモリを解放するか、コード ブロックを使用してカスタム スコープを使用するために、ローカル スコープの最後まで待つことができました。

ただし、オブジェクトごとにvoid MyObject::clear()、メモリをクリアするメソッドを実装するという考えがありました。

class MyObject{
    bool is_cleared;
    // Other stuff

public:
    MyObject();
    ~MyObject();

    void clear();
    // Other stuff
};
MyObject::MyObject()
    : is_cleared(false)
    {
        // construct the class
    }
void MyObject::clear(){
    if (!is_cleared){
        // clear memory
        is_cleared = true;
    }


}

MyObject::~MyObject(){
    this->clear();
}

このようにして、デストラクタにメモリをクリアさせるか、自分で行うことができます。これは良い習慣ですか、それとも悪い習慣ですか?どうすれば改善できますか?

4

3 に答える 3

0

この手法には特に悪い点はありません (たとえば、STL コンテナーで使用されます)。ただし、コピー コンストラクターと代入演算子も実装する必要があります (または、オブジェクトをコピー不可かつ代入不可にする必要があります)。これは、デストラクタを実装したためであり、3 つのルールに従う必要があります。

于 2012-08-22T04:17:31.500 に答える
0

それは悪い習慣です。オブジェクトの所有権は、「必要なくなった」ときに破棄されるように設計する必要があります。

これは、オブジェクトをヒープに割り当て、使い終わったら削除するだけの簡単なものです。次に、割り当てた動的メモリをクリーンアップします。

于 2012-08-22T04:17:39.447 に答える
0

私はこれを悪い習慣としてフラグします。

まず、サイズが大きい場合は、必要のないものをできるだけ早く解放する必要があります。オブジェクトが終了するまでデータが保持されない場合は、オブジェクトに大きなデータを格納するためにメンバーを使用しないでください。この規則にはいくつかの例外があります。オブジェクトの多くがそれを必要とする場合、責任が多すぎるオブジェクトを設計しています。

では、前にメモリをクリーニングする必要があることを測定しましたか? そうでない場合、これは不必要な最適化である可能性があります。彼らが範囲外になるまで待ってください。

于 2012-08-22T04:20:57.133 に答える