すべてのコードを 1 か所に配置すると、ここで問題を確認するのがおそらく最も簡単になります。
Number *nmbr;
class ArrayClass {
Number *nmbr;
public:
ArrayClass() {
Number *nmbr = new Number[2];
}
};
ここにあるのは、3 つの別々のスコープにある 3 つの完全に別々の変数です。それぞれが外側のスコープで同じ名前の変数を「隠します」。
これは、コンストラクターで初期化するときに、コンストラクター自体に対してローカルな変数のみを初期化することも意味nmbr
します。ctor が戻ると、そのポインターは破棄され、割り当てたメモリがリークされます。同様に悪いことに、ArrayClass::nmbr
(ほぼ確実に) 初期化したかった はまだ初期化されていません。
クラスのnmbr
外側にある はほぼ同じですが、1 つの点でわずかに安全です。グローバルであるため、ゼロで初期化されます。これはポインターであるため、null ポインターに初期化されることを意味します (したがって、データを指していませんが、少なくともテストが簡単で、そうでないことがわかります)。
これを防ぐには、おそらく変数の余分な定義を削除して、すべての参照nmbr
が同じものを参照するようにする必要があります。
class Array {
Number *nmbr;
public:
Array() : numbr(new Number[2]) {}
};
このクラスはリモート所有権を行っているように見える (つまり、ポインターを介してデータを割り当てて所有する) ため、5 の規則 (C++11 の古い 3 の規則の更新) に従う必要があります。代わりに a を使用すると、「ゼロの規則std::vector<Number>
」に従うことができます。