我一直在尝试开发的DynamicStack的pop()函数中出现堆损坏错误。

现在,我已经对其进行了设置,以便如果项数少于我之前设置的容量的1/4,那么DynamicStack的大小将减半(除非新的减半的容量小于我的原始容量)。

我得到的确切错误(使用Visual C++)是:

检测到堆更坏:在正常块($ 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_,capacity_,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 []真的不需要任何内存分配权吗?如果存在某些内容,则删除它应该没有问题。

最佳答案

因此,答案实际上很尴尬。我在DynamicStack.cpp中将Capacity_标记为Capacity,基本上这使构造函数搞砸了。

10-04 20:43