次のコードを検討してください。
class myarray
{
int i;
public:
myarray(int a) : i(a){ }
}
スタック上に myarray のオブジェクトの配列を作成する方法と、ヒープ上にオブジェクトの配列を作成する方法を教えてください。
次のコードを検討してください。
class myarray
{
int i;
public:
myarray(int a) : i(a){ }
}
スタック上に myarray のオブジェクトの配列を作成する方法と、ヒープ上にオブジェクトの配列を作成する方法を教えてください。
次の方法で、スタック†</sup>にオブジェクトの配列を作成できます。
myarray stackArray[100]; // 100 objects
そして、ヒープ†</sup> (または「フリーストア」):
myarray* heapArray = new myarray[100];
delete [] heapArray; // when you're done
ただし、自分でメモリを管理しないことをお勧めします。代わりに、std::vectorを使用します。
#include <vector>
std::vector<myarray> bestArray(100);
ベクトルは動的配列であり、(デフォルトで) ヒープから要素を割り当てます。††</sup>
クラスにはデフォルトのコンストラクターがないため、スタック上に作成するには、コンストラクターに何を渡すかをコンパイラーに知らせる必要があります。
myarray stackArray[3] = { 1, 2, 3 };
またはベクトルで:
// C++11:
std::vector<myarray> bestArray{ 1, 2, 3 };
// C++03:
std::vector<myarray> bestArray;
bestArray.push_back(myarray(1));
bestArray.push_back(myarray(2));
bestArray.push_back(myarray(3));
もちろん、いつでもデフォルトのコンストラクターを指定できます。
class myarray
{
int i;
public:
myarray(int a = 0) :
i(a)
{}
};
†衒学者向け: C++ には実際には「スタック」または「ヒープ」/「フリーストア」がありません。私たちが持っているのは、「自動ストレージ」と「動的ストレージ」の期間です。実際には、これはスタック割り当ておよびヒープ割り当てと一致します。
†† スタックからの「動的」割り当てが必要な場合は、最大サイズを定義し (スタック ストレージは事前にわかっています)、代わりにスタックを使用するように vector に新しいアロケータを指定する必要があります。
C++11std::array<T,size>
は、スタックに割り当てられた配列で使用できるためです。T[size]
のインターフェイスを提供してラップしますstd::vector
が、ほとんどのメソッドはconstexpr
. ここでの欠点は、いつスタックをオーバーフローするかわからないことです。
std::array<myarray, 3> stack_array; // Size must be declared explicitly.VLAs
ヒープ メモリを使用して割り当てられた配列の場合はstd::vector<T>
. カスタム アロケーターを指定しない限り、標準の実装ではヒープ メモリを使用して配列メンバーを割り当てます。
std::vector<myarray> heap_array (3); // Size is optional.
どちらの場合も、配列を初期化するにはデフォルトのコンストラクターが必要なので、定義する必要があることに注意してください。
myarray::myarray() { ... }
C のVLAや C++の を使用するオプションもありますがnew
、これらを使用すると、コードでセグメンテーション フォールトやメモリ リークが発生しやすくなるため、できるだけ使用しないでください。
クラスmyarrayのオブジェクトの配列を(スタックまたはヒープのいずれかで)作成する場合は、デフォルトのコンストラクターを定義する必要があります。
オブジェクトの配列を作成するときに、コンストラクターに引数を渡す方法はありません。
デフォルトのコンストラクターを使用せずにオブジェクトを作成する方法を知っていますが、スタック上でのみ:
MyArray クラスの 10 個のオブジェクトを次のように作成するとしますa = 1..10
。
MyArray objArray[] = { MyArray[1], MyArray[2]......MyArray[10]}
デストラクタはスタックに作成されるため、呼び出す必要はありません。
#include <stdio.h>
class A
{
public:
A(int a){
printf("\nConstructor Called : %d\n",a);
aM = a;
}
~A(){
printf("\ndestructor Called : %d\n",aM);
}
private:
int aM;
};
int main()
{
A **a = new A*[10];
for (int i = 0;i<10;i++)
a[i] = new A(i+1);
for (int i = 0;i<10;i++)
delete a[i];// = new A(i+1);
delete []a;
}