首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于HEAP CORRUPTION DETECTED异常的有关问题

2013-03-27 
关于HEAP CORRUPTION DETECTED错误的问题#include iostream#include string#include vectorusing na

关于HEAP CORRUPTION DETECTED错误的问题

#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];
就可以了?
[解决办法]
分配的内存不够,vector::push_back 会自动增加,new [] 的没有这个功能,arr[i]= ivec[i]; 就要出错了。
[解决办法]
首先这里有一个关于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]都是越界访问,出错很正常。
[解决办法]
引用:
引用:分配的内存不够,vector::push_back 会自动增加,new [] 的没有这个功能,arr[i]= ivec[i]; 就要出错了。
可是我定义的是动态数组啊

动态数组的意思是大小在程序运行时确定,而非编译时。不过这样的数组不会自动调节自己的大小去适应需求,还得你自己增加相应的逻辑去实现大小自适应的功能。

热点排行