主题:new开辟二维数组出现的问题
lynn9
[专家分:50] 发布于 2012-04-20 15:25:00
主函数里代码如下
long n=12000;
double** matrix=new double*[2*n];
for(long i=0;i<2*n;i++)
matrix[i]=new double [2*n];
//part1
for(i=0;i<2*n;i++)
for(long j=0;j<2*n;j++)
matrix[i][j]=0.0;
断点执行到part1处时,电脑内存大概是从2.6G到500M(够用)
再继续往下执行会报错,提示matrix[i][j]越界问题。这是怎么个情况?麻烦懂的人士指点下。
另外n=1200的话,就不会有问题,难道是数组过大了?new还有这样的问题吗?
多谢各位!
回复列表 (共6个回复)
沙发
bruceteen [专家分:42660] 发布于 2012-04-21 08:26:00
这不是二维数组
代码的逻辑本身没有
算法本身肯定差到极点,首先不说开这么大数组(五百多兆)干什么,单说开这么大数组,不是一次开完(new double[2*n*2*n])而是碎着开
板凳
eastcowboy [专家分:25370] 发布于 2012-04-22 18:17:00
内存分配问题,我在自己电脑上试了一下,不是matrix[i][j]越界,而是内存不足。
总共需要的空间是24000*24000个double,大约是4.3G,而不是楼主所说的500M。
不知道楼主用的什么办法去观察内存占用量。但是如果是用Windows XP自带的“任务管理器”的话,只看“内存占用”是不够的,还要看“虚拟内存占用”。
另外说明几点:
1、Windows系统中,32位程序一般不能超过2G的内存。
2、每次new都是有开销的。举例来说,一次new一百万字节,和一百万次new(每次1个字节)相比,后者可能比前者多耗费几十倍的内存。这也是bruceteen会这样说的原因。
3 楼
lynn9 [专家分:50] 发布于 2012-05-07 17:02:00
你好,感谢你帮助回答了我的帖子。我还有点问题想询问下:
你回复说“总共需要的空间是24000*24000个double,大约是4.3G,而不是楼主所说的500M”
24000*24000个double约为2.几G吧?
我说的其实是内存占用量从2.6G到了500M,消耗了2G多的意思。
另外我的内存一共有4G,应该足够开辟这么多的空间,但我听说程序32位的最多开辟就2G左右,是因为这个问题导致我开辟更多大的空间失败吗?
最后问一下是否有64位的c++编程软件,我想是不是64位可以开辟更大的空间呢,来满足我的要求?
4 楼
tuo2000912 [专家分:0] 发布于 2012-05-09 06:57:00
用Apple系统吧,(MacOSX10.7.1)Xcode 有64位的。
下载网址:http://itunes.apple.com/us/app/xcode/id497799835?ls=1&mt=12
注:以上网址如Windows要打开,所产生的后果我概不负责。
5 楼
eastcowboy [专家分:25370] 发布于 2012-05-09 20:08:00
1、24000*24000个double,每个double是8字节,算算总共多少字节?
2、windows也有64位,不过需要用支持64位的VC(比如Visual Studio 2008),并且需要在VC中设置为64位的方式编译。
6 楼
xiaomarge [专家分:1980] 发布于 2012-06-30 20:21:00
二维数组不用这么做,做一个stl的包容器类,用一维的数组存储二维的数据,
我来回复