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

为啥new的动态数组会报错

2013-01-07 
为什么new的动态数组会报错我的程序顺序执行到某个函数时需要new一个大数组,我使用的是动态new出这个数组,

为什么new的动态数组会报错
我的程序顺序执行到某个函数时需要new一个大数组,我使用的是动态new出这个数组,例如p=new int 【1亿】,int *p定义在类的成员变量里面。我可以确定不是内存不够用,因为我如果在初始化类的时候就new这个大数组,程序是可以跑完了。而如果一开始就new这个大数组就浪费内存了,所以我在需要这个数组的时候才new,为什么就报错??我觉得好奇怪??求救,我的内存有4G
[解决办法]
虽然你的内容存够达。你的new要求这一亿内存是连续的,而系统往往不会连续空出很多空间。这就是失败的原因。
[解决办法]

try
{
  int * myarray= new int[1000];
}
catch (bad_alloc&)
{
  cout << "Error allocating memory." << endl;
}

[解决办法]
引用:
new的数组只是逻辑地址连续吧,实际存储地址应该是不连续的吧? 

你说的是链表吧
[解决办法]
默认大概4M吧,也就是400W字节,哪够你1亿个数据存的,所以你要自己设定堆大小,看数据到底要多少调一下。
还有,new的数组肯定是连续的,因为数组本身支持随机访问,比如p[999999],不连续的话肯定没法随机访问的。从这点上看,你设堆的时候要大一些,因为它找的是连续的一块够你的数组存放的地址段。
[解决办法]
引用:
引用:默认大概4M吧,也就是400W字节,哪够你1亿个数据存的,所以你要自己设定堆大小,看数据到底要多少调一下。
还有,new的数组肯定是连续的,因为数组本身支持随机访问,比如p[999999],不连续的话肯定没法随机访问的。从这点上看,你设堆的时候要大一些,因为它找的是连续的一块够你的数组存放的地址段。
你说的是栈吧,new的……


1.对基本数据类型来说, new[]操作符会调用new操作符,最终会调用malloc在堆上分配连续的地址空间;
2.建议贴出“报错”信息来看看是否有帮助;
3.如果要测试是否由于无连续大内存块可用,可以先试试new[]小一点的数据块,比如: 10万个int?


[解决办法]
用文件读写模拟内存读写是使用亿级数组的不二法门!
参考_lseeki64函数。
[解决办法]
估计是碎片问题,
举个例子,如果1G的堆使用情况如下的时候,即使总内存超过400M,但是new int [4亿] 也会失败。

[300M空闲][5K占用][300M空闲][5K占用][300M空闲][5K占用][100M空闲]

4亿int, 400M的内存,开始的时候够用,3G或者2G的地址空间支撑不了几个400M,建议在程序开始就new出来,或者编译成64位程序(支持更大的地址空间)。


热点排行