まず、あなたはメモリリークがあります。しかし、その疑問はおそらくそれに関するものではありません。だから、配列の割り当てを解除するデストラクタがあるとしましょう。
template<typename Type>
class Array {
size_t n;
Type* buff;
public:
Array(size_t n_): n(n_), buff(new Type[n]) {}
~Array() { delete[] buff; }
};
今この特定のコードが完全に安全です。 n_
を割り当てている間に例外がスローされることはありません。初期化の順番は正しいですし、buff
はクラス内の唯一の生ポインタです。ただし、クラスを拡張してクラスを追加すると、メモリリークのリスクが高くなります。
あなたはclass Array
に1人の以上のメンバーを追加する必要があることを想像して:
template<typename Type>
class Array {
size_t n;
Type* buff;
SomethingElse xyz;
public:
Array(size_t n_): n(n_), buff(new Type[n_]), xyz(n_) {}
~Array() { delete[] buff; }
};
SomethingElse
のコンストラクタがスローした場合、デストラクタ~Array()
が呼び出されることはありませんので、buff
に割り当てられたメモリは、リークが発生します。あなたは(アカウントに例外を取って)自分でストレージの割り当てを解除する責任がある、と自動的にストレージ割り当て解除の世話をすることができ、そのようなstd::unique_ptr
やstd::shared_ptr
などのツールを紹介しますので、このようなType* buff
生のポインタとしてポインタを呼び出す++
近代C。
template<typename Type>
class Array {
size_t n;
std::unique_ptr<Type[]> buff;
public:
Array(size_t n_): n(n_), buff(new Type[n_]) {}
};
お知らせデストラクタの有無:あなたはこのようなあなたのクラスを書くことができ++現代Cで
。 unique_ptr
はdelete
を呼び出します。
も注意初期化子リスト内のクラスのメンバーに依存関係のない(単にnew Type[n_]
の代わりnew Type[n]
を書くことは、あなたのコードはより堅牢になり)
デストラクタを持っていないので、メモリリークにつながる可能性があります。 –
@ArnavBorborahですが、それは唯一危険なものですか? – Loay