C++ 正在删除阵列-检测到堆损坏

C++ 正在删除阵列-检测到堆损坏,c++,memory-management,C++,Memory Management,我有一个简单的代码(为了简化,重要的部分可能只有构造函数和add方法。)(代码更新) #包括“general.h” 模板 类模板 { 私人: T*oldArr; T*newArr; int oldArrTop; 内奥达伦; 公众: 模板(); ~Template(); 无效添加(常量T&val); 作废打印(); }; 模板 模板::模板() { oldArr=newt[2]; oldArrTop=0; oldArrLen=2; newArr=newt[4]; //newArr的长度始终为2。

我有一个简单的代码(为了简化,重要的部分可能只有构造函数和add方法。)(代码更新)

#包括“general.h”
模板
类模板
{
私人:
T*oldArr;
T*newArr;
int oldArrTop;
内奥达伦;
公众:
模板();
~Template();
无效添加(常量T&val);
作废打印();
};
模板
模板::模板()
{
oldArr=newt[2];
oldArrTop=0;
oldArrLen=2;
newArr=newt[4];
//newArr的长度始终为2。
}
模板
模板::~Template()
{
删除[]oldArr;
删除[]newArr;
}
模板
无效模板::添加(常量T&val)
{
//正常添加
oldArr[oldArrTop]=val;
//需要复制2个元素
如果(oldArrTop%2==1)
{
newArr[oldArrTop]=oldArr[oldArrTop];
newArr[oldArrTop-1]=oldArr[oldArrTop-1];
}
oldArrTop++;
//需要将数组的大小加倍
if(oldArrTop==oldArrLen)
{
删除[]oldArr;
oldArr=newArr;
奥尔达伦*=2;
newArr=newt[oldArrLen*2];
}
}
模板
无效模板::打印()
{

对于(int i=0;i只需使用
std::vector
。它将为您管理内存(如果需要,将加倍数组大小:)

只需使用
std::vector
。它将为您管理内存(如果需要,将加倍数组大小:)

我想您可以在这里访问分配区域后面的内存:

oldArr[oldArrTop]=newArr[oldArrTop];
当您添加第二个值时,oldArrTop将变为2,您将输入
if(oldArrTop%2==0)
。在此情况下,如果您的
oldArr
只有两个分配的元素,但您尝试访问第三个元素(因为oldArrTop==2,它意味着第三个元素):


我认为您可以在这里访问分配区域后面的内存:

oldArr[oldArrTop]=newArr[oldArrTop];
当您添加第二个值时,oldArrTop将变为2,您将输入
if(oldArrTop%2==0)
。在此情况下,如果您的
oldArr
只有两个分配的元素,但您尝试访问第三个元素(因为oldArrTop==2,它意味着第三个元素):



他可能正在开发一个stl不可用的系统。我怀疑他在2012年使用的是编译器,它支持模板,但没有std lib。@Idan?或者使用stl编写代码是违反公司政策的。我以前工作过的几家游戏公司有这样的政策,就像使用任何模板一样有快速膨胀代码的倾向无需猜测我为什么这么做-这是一个家庭作业:)他可能正在开发一个stl不可用的系统我怀疑他在2012年使用的编译器,它支持模板,但没有std lib。@Idan?或者使用stl编写代码只是违反公司政策L.我以前工作过的几家游戏公司都有这样的政策,因为使用任何模板化的东西都有快速膨胀代码的趋势。不需要猜测我为什么这么做——这是一个家庭作业:)我相信删除[]oldArr;只删除指向数组中第一个元素的指针。必须遍历并删除数组中的每个元素array@timkd127除非他把它变成一个指针数组,否则这是不必要的。@Idan:你试过把
oldArrTop++
移到作业之外吗?也许有一个奇怪的顺序你可以发布使用这个的代码吗?你已经违反了。试着在每次添加后打印对象,看看结果是什么,你应该能够通过自己在这一点上单步执行逻辑来了解发生了什么我相信删除[]oldArr;只删除指向数组中第一个元素的指针。必须遍历并删除数组中的每个元素array@timkd127除非他把它变成一个指针数组,否则这是不必要的。@Idan:你试过把
oldArrTop++
移到作业之外吗?也许有一个奇怪的顺序继续你的编译器你能发布使用这个的代码吗?你已经违反了。试着在每次添加后打印对象,看看结果是什么,你应该能够通过自己在这一点上单步通过逻辑来了解发生了什么。这是一个错误。我的意思是写newArr[oldArrTop-1]=oldArr[oldArrTop-1];newArr是一个长度为oldArr两倍的数组,每两个版本后,oldArr的元素都会被复制到newArr中。@Idan这肯定是正确的答案。在第二次添加
oldArrTop
后,代码现在的发布方式在该行等于2,该行通过
oldArrTop%2==0
,并将尝试写入
oldArr[2]
超出数组边界。然后当程序尝试
删除oldArr[]
时,它会检测堆corruption@Idan换句话说,您必须在检查if(oldArrTop==oldArrLen)后放置
oldArr[oldArrTop++]=val
为了避免内存溢出哦,所以我需要oldArrTop-1和oldArrTop-2!(或者在第二个if之后增加oldArrTop…)明白了。谢谢!但我有另一个问题:它现在没有崩溃,但这是我的输出:-84215041-84215041-84215041-84215041 4 5 6 7 8 9(用新行代替从0到9的数字)。你知道为什么会发生这种情况吗?@I我怀疑你现在看到的问题是你将项目复制到
newArr
的方式造成的。它似乎缺少前4个元素(0-3)。这是一个错误。我的意思是编写newArr[oldArrTop-1]=oldArr[oldArrTop-1];newArr是一个长度为oldArr两倍的数组,每两个版本后,oldArr的元素都会被复制到newArr中。@Idan这肯定是正确的答案。在第二次添加
oldArrTop
后,代码现在的发布方式在该行等于2,该行通过
oldArrTop%2==0
,并将尝试写入
oldArr[2]
超出数组边界。然后当程序尝试
oldArr[oldArrTop]=newArr[oldArrTop];
oldArr[2]=newArr[2];