c++でクラスの配列メンバのメモリを確保するかどうか迷っています。
私のクラスでは、配列メンバーを次のように定義しました。
class A
{
public:
B* B_array[1000];
}
そして、コンストラクターでそれを使用したい:
A::A()
{
for(int i = 0; i < 1000; i++)
{
B_array[i] = new B;//can i use B_array[0...999]???
}
}
B* B_array[1000];
あなたが持っているのは1000
、 type へのポインタの配列ですB
。
for(int i = 0; i < 1000; i++)
{
B_array[i] = new B;//can i use B_array[0...999]???
}
配列内の各ポインターにメモリーを割り当てます。このステートメントの後、各ポインターはヒープ上のメモリーを指します。
はい、このコードが実行されると、それぞれを使用できます。
はい、できます。コンストラクターの本体に入ると、初期化されるのを待っている初期化されていないポインターが 1000 個あります。
ただし、使用する必要があるのはstd::vector<B>
class A
{
public:
std::vector<B> array;
}
A::A() : array(1000) {}
そしてそれで終わります。ベクターはその要素を動的に割り当てます。
はい、できます。1000 個のポインタのメモリが常に割り当てられます。ただし、これらのポインターは、自分で行わない限り初期化されません (コンストラクター コードにいるため)。
c++でクラスの配列メンバのメモリを確保するかどうか迷っています
はい、そうではありません。あなたが行っている方法で配列を割り当てることについて疑問がある場合は、可能です。A のコンストラクターにいる間に B のコンストラクターを呼び出すことに疑問がある場合、それについてもまったく問題はありません。
ただし、一般的には、示されているコードで注意すべき点がいくつかあります。たとえば、値 1000 をハードコーディングしない、new からの例外をチェックするなどです。おわかりいただけると思います。
また、A のデストラクタでメモリ リソースを明示的に解放することにも気を配る必要があります。
はい、B クラス インスタンスの 1000 個のポインターのメモリが割り当てられます。オブジェクトの配列B_array[1000]
を定義しました。B*
と同じint integerArray [1000]
です。値ではなく、ポインターを配列に格納するだけです。ただし、ヒープ上の実際のオブジェクトを指すように初期化する必要があります。