回 帖 发 新 帖 刷新版面

主题:new开辟二维数组出现的问题

主函数里代码如下    
    
    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个回复)

沙发

这不是二维数组
代码的逻辑本身没有
算法本身肯定差到极点,首先不说开这么大数组(五百多兆)干什么,单说开这么大数组,不是一次开完(new double[2*n*2*n])而是碎着开

板凳

内存分配问题,我在自己电脑上试了一下,不是matrix[i][j]越界,而是内存不足。
总共需要的空间是24000*24000个double,大约是4.3G,而不是楼主所说的500M。

不知道楼主用的什么办法去观察内存占用量。但是如果是用Windows XP自带的“任务管理器”的话,只看“内存占用”是不够的,还要看“虚拟内存占用”。

另外说明几点:
1、Windows系统中,32位程序一般不能超过2G的内存。
2、每次new都是有开销的。举例来说,一次new一百万字节,和一百万次new(每次1个字节)相比,后者可能比前者多耗费几十倍的内存。这也是bruceteen会这样说的原因。

3 楼

你好,感谢你帮助回答了我的帖子。我还有点问题想询问下:
你回复说“总共需要的空间是24000*24000个double,大约是4.3G,而不是楼主所说的500M”
24000*24000个double约为2.几G吧?
我说的其实是内存占用量从2.6G到了500M,消耗了2G多的意思。
另外我的内存一共有4G,应该足够开辟这么多的空间,但我听说程序32位的最多开辟就2G左右,是因为这个问题导致我开辟更多大的空间失败吗?
最后问一下是否有64位的c++编程软件,我想是不是64位可以开辟更大的空间呢,来满足我的要求?

4 楼


用Apple系统吧,(MacOSX10.7.1)Xcode 有64位的。
下载网址:http://itunes.apple.com/us/app/xcode/id497799835?ls=1&mt=12
注:以上网址如Windows要打开,所产生的后果我概不负责。

5 楼

1、24000*24000个double,每个double是8字节,算算总共多少字节?
2、windows也有64位,不过需要用支持64位的VC(比如Visual Studio 2008),并且需要在VC中设置为64位的方式编译。

6 楼

二维数组不用这么做,做一个stl的包容器类,用一维的数组存储二维的数据,

我来回复

您尚未登录,请登录后再回复。点此登录或注册