关于HEAP CORRUPTION DETECTED错误的问题

tingfengx 2013-03-25 08:24:20
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main(void)
{
int number,i= 0;
vector<int> ivec;
int *arr= new int[ivec.size()];
cout<< "Enter the vector"<< endl;
while(cin>> number)
{
ivec.push_back(number);
arr[i]= ivec[i];
}

for(i= 0;i!= ivec.size(); ++i)
cout<< arr[i]<< endl;
delete [] arr;
return 0;
}

这个程序是把vector赋值给数组,
为什么会出现这个错误
heap corruption detected:after normal block(#xxx) at 0x xxxxxxxx
crt detected that the application wrote to menory after end of heap buffer
而当我把
int *arr= new int[ivec.size()];
多分配一个空间
int *arr= new int[ivec.size()+1];
就可以了?
...全文
644 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2013-03-26
  • 打赏
  • 举报
回复
引用 3 楼 tingfengx 的回复:
引用 2 楼 ri_aje 的回复:分配的内存不够,vector::push_back 会自动增加,new [] 的没有这个功能,arr[i]= ivec[i]; 就要出错了。 可是我定义的是动态数组啊
动态数组的意思是大小在程序运行时确定,而非编译时。不过这样的数组不会自动调节自己的大小去适应需求,还得你自己增加相应的逻辑去实现大小自适应的功能。
tofu_ 2013-03-26
  • 打赏
  • 举报
回复
引用 楼主 tingfengx 的回复:
C/C++ code?12345678910111213141516171819202122#include <iostream>#include <string>#include <vector>using namespace std; int main(void){ int number,i= 0; vector<int> ivec; int *ar……
上面说错了一点,while循环里覆盖arr[i]区域的不是输入的数字,而始终是第一个数字,因为ivec[i]一直就是ivec[0]。 你说之后不报错了,那只是运气。之前你有越界写入的情况,后来你只是越界读取,相比之下,写入报错的概率比读取报错要大得多。
tofu_ 2013-03-26
  • 打赏
  • 举报
回复
首先这里有一个关于new分配的细节问题。

vector<int> ivec;
int *arr= new int[ivec.size()];
在这里,ivec中不包含任何数据,所以ivec.size()等于0,那么第一行就是int *arr = new int[0]。 在c和c++中,不存在分配0字节这样的事情,因为这样的话,那返回的指针该是多少呢?如何区分两个new出来的0长度数组?也是,c和c++在分配内存的时候,至少会分配一个字节的空间,这样就有一个合法的地址了。 int *arr = new int[ivec.size()] =》int *arr = (int *)(new char[1]); 很显然,这里arr[0]并不合法,因为我们本来只有1个字节的合法空间,现在却要求存取4个字节的内容。如果运气不好,arr[i]= ivec[i];这一行可能直接就崩了。 改为int *arr= new int[ivec.size()+1];之后,上面说的问题就不存在了,因为现在我们确实是有1个int的空间了。在while循环中,i始终等于0,输入的数字一直在覆盖这一块区域。虽然逻辑不合你的要求,但是绝对不会崩溃。 再来看后面的for循环。

for(i= 0;i!= ivec.size(); ++i)
    cout<< arr[i]<< endl;
这里i从0到ivec.size()-1。在ivec中,这都是合法的下标。但是对arr就不合法了。 你前面arr只是分配了1个字节的内存空间(运行new的时候,ivec.size()为0,之后就算ivec.size()改变,arr的长度也不可能再变了,除非你再new一次),所以只有arr[0]是合法的,后面所有的arr[i]都是越界访问,出错很正常。
tingfengx 2013-03-26
  • 打赏
  • 举报
回复
引用 2 楼 ri_aje 的回复:
分配的内存不够,vector::push_back 会自动增加,new [] 的没有这个功能,arr[i]= ivec[i]; 就要出错了。
可是我定义的是动态数组啊
ri_aje 2013-03-26
  • 打赏
  • 举报
回复
分配的内存不够,vector::push_back 会自动增加,new [] 的没有这个功能,arr[i]= ivec[i]; 就要出错了。
tingfengx 2013-03-26
  • 打赏
  • 举报
回复
没有人会吗?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧