【问题标题】:C++ Heap Corruption Detected While Deleting Array删除数组时检测到 C++ 堆损坏
【发布时间】:2019-08-28 10:07:40
【问题描述】:

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

现在我已经设置好了,如果项目的数量小于我之前设置的容量的 1/4 左右,那么 DynamicStack 的大小将减半(除非新减半的容量小于我原来的容量容量)。

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

检测到堆损坏:在 0x010AF0D0 的正常块 ($154) 之后。 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;
}

这也是我为这个堆栈制作的推送函数

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;
    }

在 main 中,我使用默认初始化运行测试。

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[] 真的不需要任何内存分配,对吧?如果有东西存在,删除它应该没有问题。

【问题讨论】:

  • 容量_的类型是什么。还有 size_ 和 init_capacity_ ?
  • 您应该提供有关代码的更多信息,尤其是堆栈初始化代码。
  • 我希望编译时不会出现任何错误,因为 delete[] 真的不需要任何内存分配吗? 你可以在此删除之前的任何时间都损坏了堆。您的编译器正在运行一个特殊的调试堆,在分配和解除分配时它会尝试确定堆是否损坏。
  • 最可能的问题是您越界访问动态数组。也许您正在代码中的某处访问items_ [capacity],这是一个错误。
  • 你没有在失败的测试用例中使用默认构造函数,所以它几乎不相关。

标签: c++ debugging heap-memory corruption stack-memory


【解决方案1】:

所以这个问题的答案其实很尴尬。我在 DynamicStack.cpp 中将 capacity_ 标记为容量,基本上这搞砸了构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多