23

考虑以下代码:

class myarray
{
    int i;

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

}

如何在堆栈上创建 myarray 的对象数组以及如何在堆上创建对象数组?

4

5 回答 5

52

您可以通过以下方式在堆栈上创建一个对象数组†</sup>:

myarray stackArray[100]; // 100 objects

在堆上†</sup>(或“freestore”):

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++ 并没有真正的“堆栈”或“堆”/“freestore”。我们拥有的是“自动存储”和“动态存储”持续时间。在实践中,这与堆栈分配和堆分配保持一致。

††如果你想从堆栈中“动态”分配,你需要定义一个最大大小(堆栈存储提前知道),然后给向量一个新的分配器,以便它使用堆栈。

于 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 回答