Обнаружено повреждение кучи в C ++ при удалении массива - PullRequest
1 голос
/ 06 апреля 2019

Я получаю ошибку повреждения кучи в функции pop () DynamicStack, которую я пытался сделать.

Сейчас я установил его так, что если количество элементов меньше, чем примерно 1/4 от емкости, которую я установил ранее, то DynamicStack уменьшится вдвое по размеру (если только новая половина емкости не будет меньше моей оригинальной мощности).

Точная ошибка, которую я получаю (используя Visual C ++):

ОБНАРУЖЕНА КОРРУПЦИЯ КАРТЫ: после блока Normal ($ 154) в 0x010AF0D0. CRT обнаружил, что приложение записало в память после завершения буфера кучи

StackItem DynamicStack::pop()
{
    if (size_ == 0)
        return EMPTY_STACK;
    StackItem thingToReturn = items_[size_ - 1]; // The item to return is at location size - 1
    size_--;
    if ((size_ <= capacity_ * (1.0 / 4))  && capacity_ / 2 >= init_capacity_)
    {
        StackItem * items_half = new StackItem[capacity_ / 2];
        for (int i = 0; i < size_; i++)
            items_half[i] = items_[i];
        capacity_ = capacity_ / 2;
        delete[] items_;    // ERROR IS HERE
        items_ = items_half;
    }
    return thingToReturn;
}

Вот также функция push, которую я сделал для этого стека

void DynamicStack::push(StackItem value)
{
    if (size_ != capacity_)
        items_[size_] = value;
    else
    {
        StackItem * items_new = new StackItem[capacity_ * 2];
        for (int i = 0; i < capacity_; i++)
            items_new[i] = items_[i];
        items_new[capacity_] = value;
        capacity_ = capacity_ * 2;
        delete[] items_;
        items_ = items_new;
    }
    size_++;
}

Вот конструктор по умолчанию для динамического стека Где items_ ,acity_, size_ и init_capacity_ имеют тип int.

DynamicStack::DynamicStack()
{
    items_ = new StackItem[16];
    capacity_ = 16;
    size_ = 0;
    init_capacity_ = 16;
}

Это тест, который я запускаю, который вызывает ошибку буфера кучи:

bool test3()
    {
        DynamicStack stack(24);
        stack.push(10);
        stack.push(20);
        ASSERT_TRUE(stack.peek() == 20)
            ASSERT_TRUE(stack.pop() == 20)
            ASSERT_TRUE(stack.pop() == 10)
            ASSERT_TRUE(stack.pop() == DynamicStack::EMPTY_STACK)
            ASSERT_TRUE(stack.peek() == DynamicStack::EMPTY_STACK)
            return true;
    }

В основном я запускаю тест с инициализацией по умолчанию.

int main()
{
    DynamicStackTest stack_test;
    bool stack_test3_passed = stack_test.test3();
    cout << "---Dynamic Stack Tests---" << endl;
    cout << "Test3: " << get_status_str(stack_test3_passed) << endl;
}

Я ожидал, что не должно быть никаких ошибок при компиляции как delete [], не должно ли действительно требоваться какое-то распределение памяти, верно? Если что-то существует, не должно быть проблем с его удалением.

1 Ответ

0 голосов
/ 09 апреля 2019

Так что ответ на этот вопрос довольно смущающий.Я пометил емкость_ как емкость в DynamicStack.cpp, и в основном это испортило конструкторы.

...