2013-07-30 22 views
7

Sto eseguendo questo codice, compilato su 64 bit vC++ 2005, su Windows Server 2008 R2 con 32 GB. C'è una violazione di accesso all'interno del ciclo for.Assegnazione di oltre 4 GB di memoria in un sistema a 64 bit

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

Quindi, se non v'è alcuna eccezione nel nuovo doppio [536870912], perché mi appare una violazione di accesso quando si fa un incarico su una particolare posizione array?

Un altro punto degno di nota è che questo programma è stato testato con successo su un altro computer.

+1

Un eccesso di commissione potrebbe essere il colpevole. – syam

+6

Un problema è che (penso) 'long int' è 32 bit su Windows a 64 bit, quindi il ciclo non terminerà mai. Dovresti cambiare il tipo di 'i' in' size_t' per essere sicuro che sia abbastanza grande per qualsiasi indice di array. Non ho idea se sia l'unico problema, però. –

+0

Il fatto è che stampa oltre un centinaio di numeri e poi c'è una violazione di accesso, quindi sembra che non stia raggiungendo il limite. – Jordi

risposta

3

E 'probabilmente uno dei seguenti problemi:

  • long int è 32 bit: che significa il vostro valore massimo è 2147483647, e sizeof (doppio) * 536870912> = 2147483647. (non lo faccio so davvero se ha senso, dipende probabilmente da come funziona il compilatore)
  • L'allocazione non funziona.

suggerisco di testare il codice seguente:

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

} 

Montaggio: Usando questo codice, ho appena raggiunto allocare un unico blocco di 9GB.