[踩坑集锦] 出现debug error: CRT detected that the application wrote to memory after end of heap buffer的一种情形
这周编程任务呢,是编写 SeqList类并对其进行测试,然而编写完成之后,通过三个小程序进行测试的时候出了问题。其中第二个小程序是对数据进行冒泡排序,问题也正是出现在这里。
冒泡排序的小程序主函数是这样的:
void bubble_seqlist(SeqList& L);//冒泡排序 函数声明
void display_seqlist(Type* first, Type* last);//输出顺序表 函数声明
int main()
{
SeqList L;
int temp;
cout << "input 10 intergers:\n";
for (int i = 0; i < 10; i++)
{
cin >> temp;
L.InsertRear(temp);
}
bubble_seqlist(L);
display_seqlist(L.Begin(), L.End());
return 0;
}
void bubble_seqlist(SeqList &L)//(已修改)目测有问题,仅排了前几个数据,但是还没查出来
{
int i(0), j, last, n = L.Size();//i=0初始化;n表示数据个数
Type temp;
while (i < n - 1)//第一层循环:用于 n个数中进行n次排序,确保每个数都排序完成
{
last = n - 1;//确定 每次第一层循环 最后一个数据的角标
for(j=n-1;j>i;j--)//第二层循环:用于 寻找最小数并 排序,确定位置
if (L[j] < L[j - 1])//寻找两个数中的最小数,并把小数放在前面
{
temp = L[j - 1];
L[j - 1] = L[j];
L[j] = temp;
last = j;//找到小数的角标,通过last传给i
//(即完成一次最小数放最前的操作之后,把最小数去掉,留下剩下的数字中,第一个数字的角标)
}
i = last;//确认下次循环 的第一个数据(由于是从后向前比较,故也可看做是最后比较的数据的角标)
}
}
void display_seqlist(Type* first, Type* last)//顺序表数据输出
{
for (; first != last; ++first)
cout << *first << '\t';
cout << endl;
}
定义SeqList类的时候,默认构造函数使用的是:
SeqList::SeqList()
{
data = new Type(MAXSIZE);
size = 0;
}
然后报错。
查找资料发现,这个debug error有两种可能:
1、重复释放空间
2、对数组元素操作时,超出了操作范围,即越界了
经过了多次测试,我确认到我的报错的原因是第一点,即重复释放空间。
为什么呢?
我找了好久,才发现,原来是分配动态空间的时候出了问题,细心的朋友大概已经看出来了,在上面的代码里面,有一处隐秘的格式错误:
data = new Type (MAXSIZE);
而分配动态内存空间的正确格式应该是:
data = new Type [MAXSIZE];
就是括号的区别。
改正之后,就不再报错了。
由于一开始的格式错误导致了,一开始内存空间就分配失败了,所以后面的释放过程就报错,因为一开始就没有分配成功,本就没法释放。