2013-07-30 2 views
7

Я запускаю этот код, скомпилированный на 64-битном vC++ 2005, на Windows Server 2008 R2 с 32 ГБ. Внутри цикла for есть нарушение доступа.Выделение памяти более чем на 4 ГБ в 64-битной системе

#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; 
} 

Так что, если не является исключением в новом двойной [536870912], почему я получаю нарушение прав доступа при выполнении задания на определенную позицию массива?

Еще один момент, который стоит упомянуть, заключается в том, что эта программа была успешно протестирована на другом компьютере.

+1

Преступлением вполне может быть преступник. – syam

+6

Одна из проблем заключается в том, что (я думаю) 'long int' 32 бит в 64-битной Windows, поэтому цикл никогда не будет завершен. Вы должны изменить тип 'i' на' size_t', чтобы быть уверенным, что он достаточно большой для любого индекса массива. Я понятия не имею, является ли это единственной проблемой. –

+0

Дело в том, что он печатает более ста номеров, а затем есть нарушение прав доступа, поэтому, похоже, он не достигает предела. – Jordi

ответ

3

Это, вероятно, одна из следующих проблем:

  • долго ИНТ 32 бита: это означает, что ваше максимальное значение 2147483647 и SizeOf (двойной) * 536870912> = 2147483647. (я не действительно знаю, если это имеет смысл. Вероятно, это зависит от того, как работает компилятор)
  • Ваше выделение не работает.

Я предлагаю вам проверить следующий код:

#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.