[踩坑集关于出现debug error: CRT detected that the application wrote to memory after end of heap buffer的一种情形

[踩坑集锦] 出现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]

就是括号的区别

改正之后,就不再报错了。

扫描二维码关注公众号,回复: 14121336 查看本文章

由于一开始的格式错误导致了,一开始内存空间就分配失败了,所以后面的释放过程就报错,因为一开始就没有分配成功,本就没法释放。

猜你喜欢

转载自blog.csdn.net/weixin_45795947/article/details/105343080
今日推荐