Создание массива объектов в стеке и куче
рассмотрим следующий код:
class myarray
{
int i;
public:
myarray(int a) : i(a){ }
}
Как вы можете создать массив объектов myarray в стеке и как вы можете создать массив объектов в куче?
5 ответов
вы можете создать массив объектов на стеке† via:
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);
вектор-это динамический массив, который (по умолчанию) выделяет элементы из кучи.††
потому что ваш класс не имеет конструктора по умолчанию, чтобы создать его на стек вам нужно, чтобы компилятор знал, что передать в конструктор:
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". У нас есть" автоматическое хранение "и" динамическое хранение". На практике это согласуется с распределением стека и распределением кучи.
†† если вы хотите "динамическое" распределение из стека, вам нужно будет определить максимальный размер (хранилище стека известно заранее), а затем дать вектору новый распределитель, чтобы он использовал стек вместо этого.
С 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++'ы new
, но вы должны воздерживаться от их использования как можно больше, потому что их использование делает код склонным к ошибкам сегментации и утечкам памяти.
Если вы создаете массив объектов класса myarray (либо в стеке, либо в куче), вам нужно будет определить конструктор по умолчанию.
невозможно передать аргументы конструктору при создании массива объектов.
Я знаю, как создать объект из конструктора по умолчанию, но только в стеке:
Предположим, вы хотите создать 10 объектов для класса MyArray с помощью 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;
}