Другие языки программирования и технологии

как организивать на С++ Динамическое создание массива, (количество элеметнтов - как задать динамически?)

напрямую по переменной задать размерность массива не получается: int i_mass = 1; //обьявляем переменную - количество вносимых пользователей std::cin>>i_mass; //считываем сколько нужно добавить пользователей user_data users[i_mass]; //задаем массив (user_data - это КЛАСС) в иннете вычитал что можно линейной разверткой int (*array)[ncolumns] = new int [nrows][ncolumns]; но я никак неможу вникнуть как се работает плиз напишите рабочий пример с описанием логики :)
Логика банальная. Странно, что про классы знаешь, а как работаь с памятью, не знаешь.

class MyClass
{
public:
MyClass() {} // должен быть конструктор по умолчанию (без параметров)
void Method();
};

// задаем размер массива
int ArraySize = 100;

MyClass *Array = new MyClass[ArraySize];
/*
здесь происходи следующее: выделяется память размером ArraySize * sizeof(MyClass)
в каждом кусочке размером sizeof(MyClass) будет жить объект класса MyClass,
Затем для каждого объекта в массиве вызывается конструктор по умолчанию,
Возвращается указатель на первый объект
*/

for (int k = 0; k < ArraySize; k++)
{
Array[k].Method(); // здесь можно эксплуатировать объекты
}

// Удаление массива!
// Это нужно делать оператором delete [ ]
delete [ ] Array;

просто оператор delete удаляет один объект, созданный new MyClass

delete [ ] удаляет массив объектов, созданный new MyClass[ Size ];
Он сначала вызывает деструктор для каждого объекта массива, а затем освобождает память, занятую массивом.
Вячеслав Бендрик
Вячеслав Бендрик
21 360
Лучший ответ
С двумерными (многомерными) массивами чуть сложнее, но ни чего страшного. Массив любой размерности всё равно в памяти располагается одномерно. По-этому чтоб выйти на n-ную строку нужно знать адрес её первого элемента. Исходя из этого двумерный массив можно представить массивом указателей на строки массива. Исходя из этого выделяем память таким образом

int nrows=100;
int ncolumns=100;
int **arr;//указатель на массив указателей
arr=new int *[nrows]; //выделяем память под массив указателей на строки
for(int i =0; i < nrows; i++)
{
arr[ i ]=new int[ncolumns]; //выделям память под элементы строки
{
for(int j=0;j < ncolumns;j++) //можно сразу инициализировать элементы массива
}
arr[ i ][ j ]= i * j;
}
Когда массив больше не нужен освобождаем память
for(int i =0; i < nrows; i ++)
{
delete [] arr[ i ];//освобождаем сначала указатели на строки
}
delete [] arr; //освобождаем указатель на массив указателей на строки
например
массив целых чисел на n элементов
int * mass = new int[n];
тут мы выделяем динамически кусок памяти (используя указатель)
тут есть одно но переменная n к этому моменту должна быть инициализирована, иначе не будет известно сколько памяти нужно выделить и будет runtime error.
более сложные формы (матрицы, кубические массивы) требуют более сложной инициализации, в нете есть материал
user_data users[i_mass]; //задаем массив (user_data - это КЛАСС)
тогда так user data * users = new user_datd[i_mass];
-
--
-
-
delete users;