-1

deleteオーバーロードを使用するか、またはdel()機能などを使用してクラスメンバーの割り当てを解除する必要がありますか?クラスメンバーの割り当てを正しく解除するにはどうすればいいですか?

class Field 
{ 
private: 
    size_t* square = new size_t[5]; 
public: 
    void del() 
    { 
     delete[] square; 
    } 
    void operator delete (void* p) 
    { 
     delete[] reinterpret_cast<Field*>(p)->square; 
    } 
}; 
int main() 
{ 
    Field f; 

    delete &f; 
    //or 
    f.del(); 
} 
+11

どちらもありません。 [デストラクタ](http://en.cppreference.com/w/cpp/language/destructor)を使用してください。 –

+5

新しいものを使用しないでください。また、それらを避けることができる場合は削除してください。 'ベクトル'を使用する – AndyG

+0

[現代のC++で新規および削除の生ポインタまたはCスタイル配列を使用する有効なユースケースはありますか?](https://stackoverflow.com/questions/46991224/are-there-any-有効な使用事例から使用して新しく削除される生ポインタまたはcスタイルのarr) – user0042

答えて

6

class Field 
{ 
private: 
    size_t* square = new size_t[5]; 
public: 
    ~Field() { delete [] square; } 
}; 

しかしRule of Zeroを学び、リソース管理クラスに代わりに延期:

移動セマンティクスを持つことのメリットは、すでに行うました
class Field 
{ 
private: 
    std::unique_ptr<size_t[]> square; 
public: 
    Field() : square(new size_t[5]) { } 
}; 

コピーセマンティクスがすでに無効化されていること、および既にリソースを管理しているデストラクタが含まれます。

2

私はクラスのメンバの割り当てを解除するには、過負荷やデル()関数または何か他のものを削除して使用する必要がありますか?

どちらもありません。

デストラクタを追加し、デストラクタ内のメモリを必ず削除してください。

class Field 
{ 
    private: 
    size_t* square = new size_t[5]; 
    public: 
    ~Field() { delete [] square; } 
}; 

その間、Rule of Threeをチェックアウトし、ルールに従ってください。あなたはデストラクタを探している

1

最初に、削除演算子をオーバーライドしないでください。これはめったに意味がありません。必要であれば、依存するオブジェクトの「クリーニング」はデストラクタで実行されます。

だから、(明示的または暗黙的に)フィールドを削除するとデストラクタをトリガすること

class Field { 
    ... 
    virtual ~Field() { delete[] square; } 
    ... 
} 

注意を記述します。

第2に、以前にnewで作成したオブジェクトの場合にのみdeleteを呼び出します。 Field f; delete &fのように自動保存期間のオブジェクトは削除しないでください。

第3に、自動保存期間もオプションの場合はnewでオブジェクトを割り当てることを避けてください。あなたが書いた場合、あなたは完全な問題を克服するでしょう:

class Field 
{ 
private: 
    size_t square[5]; 
}; 

int main() { 
    Field f; 
} 
関連する問題