#include<iostream> using namespace std; void main(void) { int in; cin >> in; int* array = new int(in); int i; for(i = 0; i != in; i++){ int temp; cin >> temp; array[i] = temp; } for(i = 0; i != in; i++) cout << array[i] << " "; delete[] array; return; }
|
已经new与delete了.但是运行后退出时出错:DAMAGE: After normal block ......
查了下网上的资料:
这样的错误主要是由内存越界操作导致堆栈被破坏引起的.我有一次申请了x大小的内存,却写入了x+y (y>0)的数据,结果导致了这样的错误。由于错误发生的地点与导致错误发生的地点不一定相邻,导致查找错误很困难,对于内存一定要小心再小心。其实大多数莫名其妙的错误都是由内存越界操作引起的
然后呢开始改:
#include<iostream> using namespace std; *void main(void) { int in; cin >> in; int* array = new int(in); int i; for(i = 0; i != in-1; i++){ int temp; cin >> temp; array[i] = temp; } for(i = 0; i != in-1; i++) cout << array[i] << " "; delete[] array; //有new必定要有delete 要不会内在泄漏的
return; }
|
我减一了 应该不会出错了吧 运行 还是同样的错误,郁闷下.
跟群里的编程爱好者讨论了下.
改成以下:
#include<iostream> using namespace std;
void main(void) { int in; cin >> in; int* one = new int(in); cout << one[0]; // one[1] = 3;
// cout << one[1]; // 这注释掉的两行如果不注释掉 照样会出现上面的问题的
delete one; int* array = new int[in]; int i; for(i = 0; i != in; i++){ int temp; cin >> temp; array[i] = temp; } for(i = 0; i != in; i++) cout << array[i] << " "; delete []array; return; }
|
这个程序没有错了.
对比下上面的,int* array = new int(in); int* array = new int[in]; 这两处不同之处,就是()与[]了.
恍然大悟.
int* array = new int[in];这个才是正确的, 指针指向申请的一个数组单元首地址.
而int* array = new int(in); 这个呢 是申请一个int单元,存放值in. 而不是一个数组.所以会越界产生错误了.
结论: 不可粗心大意.
阅读(4725) | 评论(2) | 转发(0) |