c++11 - 有人能告诉我为什么我收到“检测到堆损坏”错误吗?
问题描述
我有一个家庭作业问题,需要我制作一个模板 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 次推送调用中它失败了。
解决方案
这段代码:
temp = new T(newCap);
将尝试给你一个类型的对象T
,初始化为newCap
. 它不会为您提供T
适合您的循环的对象数组:
for (size_t i = 0; i < s-1; i++)
{
temp[i] = data[i];
}
您几乎可以肯定应该使用它:
temp = new T[newCap];
推荐阅读
- virus - 我们在 QNAP NAS 上使用 ResilioSync,而我们的一个 NAS 被 QLocker 勒索软件攻击,我们该怎么办?
- typescript - 使用 Prisma 2 和 NestJS 进行日志记录 - 依赖注入问题?
- haskell - Haskell:无法将预期类型“IO t0”与实际类型“[Char]”匹配
- php - 为什么要在类对象周围加上括号(新类)
- jenkins - 获取 Jenkins 节点 workDir 的正则表达式
- javascript - 根据索引值从 javascript 数组中删除特定项目
- asp.net - 使用 ASP.NET Web API 的后台作业
- c++ - 尝试使用 Win32 打开一个窗口但出现错误:未定义对 `WinMain@16' 的引用
- c# - 如何访问 httppostedfilebase 数组的单个元素?
- react-native - 如何将状态传递给父级?