首页 > 解决方案 > 有人能告诉我为什么我收到“检测到堆损坏”错误吗?

问题描述

我有一个家庭作业问题,需要我制作一个模板 Stack 类。我的其余代码已经过测试并且工作正常,但我的保留功能最终给了我一个“检测到堆损坏”错误。更具体地说,它看起来像这样“检测到堆损坏:在 0x01200A20 的正常块 (#186) 之后。CRT 检测到应用程序在堆缓冲区结束后写入内存。”

我查看了我能找到的所有其他线程,但没有一个能帮助解决我的问题。

template<typename T>
void Stack<T>::reserve(int newCap) 
{

    if (newCap < s || newCap == cap) 
    {
        return;
    }

    T* temp;

    cap = newCap;

    if (cap == 0)
    {
        return;
    }
    else
    {
        temp = new T(newCap);
    }

    for (size_t i = 0; i < s-1; i++)
    {
        temp[i] = data[i];
    }//When I debugged my program, this block was where the error occurred

    delete[] data;
    data = temp;

}
void Stack<T>::push(const T& val) 
{

    if (s == cap)
    {
        if (cap == 0)
        {
            reserve(1);
        }
        else
        {
            reserve((cap * 2));
        }
    }

    data[s] = val;
    s++;

}

这个函数应该做的就是将 cap 分配给 newCap,本质上它应该将数据指向一个新的 T 类型数组,并更新了存储大小。这样我就可以将更多的值推入堆栈。当我运行程序时,它能够将 7 个值推送到堆栈中,但在接下来的 6 次推送调用中它失败了。

标签: c++11

解决方案


这段代码:

temp = new T(newCap);

将尝试给你一个类型的对象T,初始化为newCap. 它不会为您提供T适合您的循环的对象数组:

for (size_t i = 0; i < s-1; i++)
{
    temp[i] = data[i];
}

您几乎可以肯定应该使用它:

temp = new T[newCap];

推荐阅读