Visual C++ Куча была повреждена (параметры: 0x774BCDD8)

482
18 апреля 2017, 09:54

Здравствуйте! Пишу свой класс 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;
}
Answer 1

Судя по приведенному коду, при вызове конструктора по умолчанию вы выделяете память для нулевого размера, т.е. по сути не выделяете ее. При этом устанавливая флаг 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;
    }
    ...
READ ALSO
Не удается создать стек в теле класса

Не удается создать стек в теле класса

Хочу создать стек с элементами класса Disk в классе Pole, но получаю ошибку: синтаксическая ошибка: отсутствие ";" перед "<"

266
Сложение двух больших чисел

Сложение двух больших чисел

Большие числа реализую как массив unsigned __int64[8]Как реализовать операции сложения и умножения для таких чисел? Нашел пример алгоритма на сайте,...

312
Функция add - С++ [требует правки]

Функция add - С++ [требует правки]

Не могу ввести в файл ФИО и название товараПомогите найти ошибку

650
RCSwitch (Arduino) Принцип работы библиотеки

RCSwitch (Arduino) Принцип работы библиотеки

Уважаемые стэковерфолверцы!

475