请考虑以下代码:
class myarray
{
int i;
public:
myarray(int a) : i(a){ }
}
如何在堆栈上创建myarray对象数组,如何在堆上创建对象数组?
答案 0 :(得分:40)
您可以通过以下方式在堆栈†上创建一个对象数组:
myarray stackArray[100]; // 100 objects
在堆†(或“freestore”):
myarray* heapArray = new myarray[100];
delete [] heapArray; // when you're done
但最好不要自己管理记忆。相反,请使用std::vector:
#include <vector>
std::vector<myarray> bestArray(100);
vector是一个动态数组,(默认情况下)从堆中分配元素。††
因为你的类没有默认构造函数,要在堆栈上创建它,你需要让编译器知道传递给构造函数的内容:
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”。我们所拥有的是“自动存储”和“动态存储”持续时间。实际上,这与堆栈分配和堆分配一致。
††如果你想从堆栈中进行“动态”分配,你需要定义一个最大大小(堆栈存储是提前知道的),然后给vector一个新的分配器,以便它使用堆栈代替。 / p>
答案 1 :(得分:6)
由于C ++ 11 std::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 VLAs或C ++ new
的选项,但您应尽量避免使用它们,因为它们的使用会使代码容易出现分段错误和内存泄漏。 / p>
答案 2 :(得分:2)
如果创建类myarray的对象数组(在堆栈或堆上),则必须定义默认构造函数。
在创建对象数组时,无法将参数传递给构造函数。
答案 3 :(得分:0)
我知道如何使用默认构造函数创建对象,但仅限于堆栈:
假设您要使用a = 1..10
为MyArray类创建10个对象:
MyArray objArray[] = { MyArray[1], MyArray[2]......MyArray[10]}
无需调用析构函数,因为它们是在堆栈中创建的。
答案 4 :(得分:-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;
}