Динамическое выделение массива объектов не удается

Я могу создать динамический размер массива целых чисел, как это:

int *cacheL2 = new int[L2/B2];

и я также могу создать объект типа Data как это:

Data one(12,12);

и теперь я хочу динамически размерный массив Data:

Data * vlaObj = new Data[L2/B2];

Но это не работает…

Также, если вы можете сказать мне, как заставить хеши работать на c ++, это было бы здорово. Я искал примеры, но все просто говорит #include «hash_map», однако, когда я пытаюсь использовать библиотеку, кажется, что я не могу найти ни одного из них.

-1

Решение

#include <vector>

// ...
std::vector<Data> v;
v.emplace_back( 12, 12 );
2

Другие решения

Нет причин не использовать контейнеры STL здесь. Рекомендуется использовать std::vector вместо сырых указателей:

#include <vector>

//...
std::vector<Data> vlaObj(L2/B2);
vlaObj.push_back(one)

Изменить: Кстати, есть ли вероятность, что значение L2 или даже B2 может быть 0?

1

Одна из наиболее вероятных причин, почему Data* arr = new Data[len]; не будет работать, потому что тип Data не имеет конструктора по умолчанию, т.е. Data::Data(),

Но неважно, Data имеет конструктор по умолчанию или нет, не рекомендуется создавать такой массив в любом случае. Как только вы динамически выделяете его new[] Вы обязуетесь позаботиться об уродливом управлении памятью, связанном с ним. Намного лучше использовать один из контейнеров STL, например: std::vector (#include <vector> требуется), который позаботится об управлении памятью для вас.

Тогда у вас есть несколько вариантов:

std::vector<Data> v;                    // option 1
v.reserve(len);
// in loop:
v.push_back(Data(x, y));            // there could be different values

std::vector<Data> v2(len);              // option 2

std::vector<Data> v3(len, Data(12,12)); // option 3

Первый вариант подойдет практически в любой ситуации. Это готовит кусок памяти, достаточно большой, чтобы держать len элементы, а затем вы можете просто заполнить v в удобной, но все же очень эффективной манере. Вариант 2 требует Data иметь конструктор по умолчанию, который решается с помощью варианта 3, который использует ваш собственный конструктор для создания элементов.

Все перечисленные варианты приводят к std::vector объект с автоматической продолжительностью хранения создается. Обратите внимание, что все элементы хранятся в непрерывном блоке памяти, поэтому вы можете использовать &v[0] чтобы инициализировать указатель на его первый элемент и работать с ним так же, как если бы вы работали с динамически размещенным массивом.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector