9

次のようなクラスがあるとします。

class SomeClass {
    public:
        SomeClass(int size) {
                     arr = new int[size];
                     someInt = size / 10;
                    };
        ~SomeClass() {
                      delete [] arr;
                      //do I need to somehow delete the int value 'someInt'?
                     };
    private:
        int *arr; //pointer to dynamically allocated array
        int someInt;
}

メモリ リークを回避するために、デストラクタには正確に何を含める必要がありますか?

配列は動的に割り当てられるため、配列を削除する必要があることは承知していますが、int 値やその他の基本データ型で何かを行う必要はありますか?

ありがとう、ジョナサン

4

6 に答える 6

23

いいえ。

しかし、基本的なタイプだけではありません。あなたが割り当てなかったものについてnewは、電話をかける必要はありませんdeleteポインターの場合でも

delete(どういうわけか) メンバー変数の型とは何の関係もありません。重要なのは、コンストラクター (またはクラスメソッドの他の場所) で(を使用して)割り当てた場合です。new

経験則は

Have as many delete as new
Have as many delete[] as new[].

もちろんdelete、割り当てていないものが必要になることもありますが、それがもう必要ない場合は指し示しています (他の誰かによって割り当てられていますが、それを使用しているのはあなただけです)。

もちろん、あなたが割り当てたものではなく、他の誰かが指している必要がある場合もありますあなたによって 割り当てられたが、他の誰かがそれを使用しています)。delete

于 2013-04-18T18:55:43.567 に答える
4

いいえ、自動変数を手動で削除する必要はありません。あなただけのdeleteものnew

さらに、スマート ポインター経由で RAII を使用すると、配列を削除する必要がなくなります。これにより、デストラクタを手動で定義する必要がなくなります。自動的に定義されたデストラクタが必要なことを行います。

class SomeClass {
    public:
        SomeClass(int size)
          : arr {new int[size]}
          , someInt = size/10;
        {};

    private:
        std::unique_ptr<int[]> arr; //pointer to dynamically allocated array
        int someInt;
}

std::vector一般的なスマート ポインターの代わりに、次のような特殊な型を使用することをお勧めします。

class SomeClass {
    public:
        SomeClass(int size)
          : arr (size)
          , someInt = size/10;
        {};

    private:
        std::vector<int> arr;
        int someInt;
}
于 2013-04-18T18:55:47.797 に答える
3

いいえ、あなたはしません。deleteを使用して割り当てられたもののみnew

于 2013-04-18T18:55:46.463 に答える
1

No.someIntは値によって保存され、自動保存期間を使用します。それが属するオブジェクトが破棄さsomeIntれると、自動保存期間を持つ他のすべてのメンバー変数も同様に破棄されます。すでに行った動的ストレージ期間 (新規/削除) を持つオブジェクトを管理する責任は引き続きあります。

于 2013-04-18T18:57:24.610 に答える
1

新しいものを削除するか、[] 新しいものを [] 削除するだけです。auto_ptrを調べることをお勧めします

于 2013-04-18T18:58:41.800 に答える