Здравствуйте! Пишу свой класс Array, который представляет из себя массив. При вызове метода append() программа выдаёт исключение
Куча была повреждена (параметры: 0x774BCDD8)
/
Microsoft C++ exception: std::bad_alloc at memory location 0x0025FDCC.
Код класса Array:
enum Mode {
Immutable = 0x01,
Mutable = 0x02
};
Array(Mode _Mode = Array::Mode::Mutable, size_t _Size = 0) {
max_size = _Size;
mode = _Mode;
_size = 0;
arr = new T[max_size];
for (size_t i(0); i < max_size; i++)
arr[i] = NULL;
}
bool append(const T value) {
if (mode == Mode::Mutable)
{
if (_size == max_size)
max_size++;
arr[_size] = value;
_size++;
return true;
}
else if (mode == Mode::Immutable && _size < max_size)
{
arr[_size] = value;
_size++;
return true;
}
else
{
std::cerr << "Memory is full!" << std::endl;
return false;
}
}
Код функции main:
int main()
{
Array<int> arr;
for (int i(0); i < 15; i++)
arr.append(i);
for (int i(0); i < 15; i++)
std::cout << arr[i] << std::endl;
_getch();
return 0;
}
Судя по приведенному коду, при вызове конструктора по умолчанию вы выделяете память для нулевого размера, т.е. по сути не выделяете ее. При этом устанавливая флаг Mutable. Далее при добавлении вы выполняете запись в память, которая так и не выделена:
arr[_size] = value;
Что ж удивляться, что программа не работает?
Я бы на вашем месте делал примерно так (написано на коленке, не компилировал - для показа идеи):
Array(Mode _Mode = Array::Mode::Mutable, size_t _Size = 0)
{
max_size = _Size;
if (max_size < 1) max_size = 1;
mode = _Mode;
_size = 0;
arr = new T[max_size];
}
bool append(const T value)
{
if (mode == Mode::Mutable)
{
if (_size == max_size)
{
T* tmp = new T[max_size*=2];
for(int i = 0; i < _size; ++i)
tmp[i] = arr[i];
delete[] arr;
arr = tmp;
}
arr[_size] = value;
_size++;
return true;
}
...
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости