23

次のコードを検討してください。

class myarray
{
    int i;

    public:
            myarray(int a) : i(a){ }

}

スタック上に myarray のオブジェクトの配列を作成する方法と、ヒープ上にオブジェクトの配列を作成する方法を教えてください。

4

5 に答える 5

52

次の方法で、スタック†</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 に新しいアロケータを指定する必要があります。

于 2009-10-21T02:18:06.663 に答える
6

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、これらを使用すると、コードでセグメンテーション フォールトやメモリ リークが発生しやすくなるため、できるだけ使用しないでください。

于 2016-01-07T07:36:23.213 に答える
2

クラスmyarrayのオブジェクトの配列を(スタックまたはヒープのいずれかで)作成する場合は、デフォルトのコンストラクターを定義する必要があります。

オブジェクトの配列を作成するときに、コンストラクターに引数を渡す方法はありません。

于 2009-10-21T02:34:37.173 に答える
0

デフォルトのコンストラクターを使用せずにオブジェクトを作成する方法を知っていますが、スタック上でのみ:

MyArray クラスの 10 個のオブジェクトを次のように作成するとしますa = 1..10

MyArray objArray[] = { MyArray[1], MyArray[2]......MyArray[10]}

デストラクタはスタックに作成されるため、呼び出す必要はありません。

于 2010-11-03T02:35:30.613 に答える
-1
#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;
}
于 2011-09-07T14:11:35.287 に答える