我有一个作业问题,要求我制作一个模板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次push调用中失败。