2013-07-30 18 views
7

Uruchomiłem ten kod, skompilowany na 64 bitach vC++ 2005, w systemie Windows Server 2008 R2 z 32 GB. W pętli for znajduje się naruszenie dostępu.Przydzielanie więcej niż 4 GB pamięci w 64-bitowym systemie

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

Więc jeśli nie ma wyjątku w nowy podwójny [536870912], dlaczego otrzymuję naruszenie zasad dostępu, gdy robi zadanie na określonej pozycji tablicy?

Warto również wspomnieć, że program ten został pomyślnie przetestowany na innym komputerze.

+1

Nadmierne zaangażowanie może być również winne. – syam

+6

Jednym z problemów jest to, że (jak sądzę) 'long int' to 32 bity w 64-bitowym systemie Windows, więc pętla nigdy się nie zakończy. Powinieneś zmienić typ 'i' na' size_t', aby mieć pewność, że jest wystarczająco duży dla dowolnego indeksu tablicy. Nie mam pojęcia, czy to jedyny problem. –

+0

Chodzi o to, że wypisuje ponad sto liczb, a następnie jest naruszenie zasad dostępu, więc wydaje się, że nie osiąga limitu. – Jordi

Odpowiedz

3

Jest to prawdopodobnie jeden z następującym problemem:

  • long int jest 32-bitów: to znaczy, że maksymalna wartość wynosi 2147483647 i sizeof (double) * 536870912> = 2147483647. (nie Naprawdę wiem, czy to ma sens, prawdopodobnie zależy to od sposobu działania kompilatora)
  • Twoja alokacja się nie udaje.

proponuję przetestować następujący kod:

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

} 

Montaż: Za pomocą tego kodu, po prostu osiągnąć przeznaczyć jeden blok 9 GB.

Powiązane problemy