c – 在64位系统中分配超过4GB的内存

前端之家收集整理的这篇文章主要介绍了c – 在64位系统中分配超过4GB的内存前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在运行此代码,在64位vc 2005上编译,在 Windows Server 2008 R2上使用32GB. for循环中存在访问冲突.
#include <iostream>
using namespace std;


int main(int argc,char* argv[])
{   
    double *x = new double[536870912];

    cout << "memory allocated" << endl;

    for(long int i = 0; i < 536870912; i++)
    {   
        cout << i << endl;
        x[i] = 0;
    }

    delete [] x;
    return 0;
}

因此,如果在新的double [536870912]中没有异常,为什么在对特定阵列位置进行赋值时会出现访问冲突?

值得一提的另一点是,该程序在另一台计算机上成功测试.

解决方法

这可能是以下问题之一:

> long int是32位:这意味着你的最大值是2147483647,sizeof(double)* 536870912> = 2147483647.(我真的不知道这是否有意义.它可能取决于compiller如何工作)
>您的分配失败.

我建议你测试下面的代码

#include<conio.h>
#include <iostream>
using namespace std;

#define MYTYPE unsigned long long


int main(int argc,char* argv[])
{   
    // Test compiling mode
    if (sizeof(void*) == 8) cout << "Compiling 64-bits" << endl;
    else cout << "Compiling 32-bits" << endl;

    // Test the size of mytype
    cout << "Sizeof:" << sizeof(MYTYPE) << endl;
    MYTYPE len;

    // Get the number of <<doubles>> to allocate
    cout << "How many doubles do you want?" << endl;
    cin >> len;
    double *x = new (std::nothrow) double[len];
    // Test allocation
    if (NULL==x)
    {
        cout << "unable to allocate" << endl;
        return 0;
    }
    cout << "memory allocated" << endl;

    // Set all values to 0
    for(MYTYPE i = 0; i < len; i++)
    {   
        if (i%100000==0) cout << i << endl;
        x[i] = 0;
    }

    // Wait before release,to test memory usage
    cout << "Press <Enter> key to continue...";
    getch();

    // Free memory.
    delete [] x;

}

编辑:使用此代码,我刚刚实现了分配一个9GB的块.

原文链接:https://www.f2er.com/c/117758.html

猜你在找的C&C++相关文章