7

デストラクタ メソッドを使用してオブジェクトを削除することは可能ですか?

私のクラスのコンストラクタとデストラクタ:

class cal
{
    public:
        cal()
        {
            days = 0;
            day = 1;
            month = 1;
            year = 1300;
            leap = true;
        };
        ~cal()
        {
            delete this;
        }
}*calendar = new cal;

クラスを介してこのポインタを削除するにはどうすればよいですか?

PS

次のコードを書き忘れました

cal *calandar = new cal[];

スタックではなくヒープで使いたい

このクラス (オブジェクト) を頻繁に (そのオブジェクトの多く) 使用したい 削除を何回書く必要があるかを想像すると、コードの理解、トラブルシューティング、およびトレースが困難になる それらを自動的に (ヒープで) 破棄したい

「delete [] calendar」を実行するときに、クラスで次のコードを使用しました。これにより、占有されている RAM (使用される RAM の量) が削減されます。プログラムを終了することによって、正しく動作しますか (すべてのオブジェクトを破棄します)? 私はGNU / Linusを使用しており、その行の有無にかかわらずすべてのオブジェクトを破壊するため、ウィンドウでのリークが心配です

void DisposeObject() { delete this; }
4

3 に答える 3

14

いいえ。デストラクタが呼び出されるまでに、オブジェクトはすでに破棄されているため、delete this有効ではありません。

動作は未定義ですが、ほとんどの場合、デストラクタが再帰的に呼び出され、スタック オーバーフローが発生します。

于 2012-07-12T16:20:54.027 に答える
11

次のようにコードを記述できます。

class cal
{
    public:
        cal()
        {
        };
        ~cal()
        {
        }
        void DisposeObject()
        {
           delete this;
        }
}

そして、それはあなたのデストラクタを呼び出します。

delete thisデストラクタが再帰的に呼び出され、スタック オーバーフローが発生する可能性があるため、デストラクタから呼び出すべきではありません。とにかく、あなたが書いたコードは未定義の動作に苦しんでいます。

詳細な議論については、この質問を参照してください: Is delete this allowed?

于 2012-07-12T16:21:31.357 に答える
3

デストラクタ メソッドを使用してオブジェクトを削除することは可能ですか?

これが有効であったとしても - 問題は、デストラクタを呼び出すものがないため、これは決して効果がないということです。デストラクタは、呼び出し元のコードがオブジェクトを削除するときに呼び出され、必要に応じて内部オブジェクトを削除できます。

あなたの場合、明示的に削除する必要があるリソースが割り当てられていないため (少なくとも表示されているものでは)、デストラクタで何もする必要はないようです。

于 2012-07-12T16:20:22.983 に答える