2013-07-30 6 views
7

Ich verwende diesen Code, kompiliert auf 64 Bit VC++ 2005, auf Windows Server 2008 R2 mit 32 GB. Es gibt eine Zugriffsverletzung innerhalb der for-Schleife.Zuweisung von mehr als 4 GB Speicher in einem 64-Bit-System

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

Also, wenn es keine Ausnahme in neue Doppeln [536870912], warum bin ich eine Zugriffsverletzung bekommen, wenn eine Zuweisung über eine bestimmte Feldposition zu tun?

Ein weiterer erwähnenswerter Punkt ist, dass dieses Programm erfolgreich auf einem anderen Computer getestet wurde.

+1

Übermäßiges Begehen könnte der Schuldige sein. – syam

+6

Ein Problem ist, dass (glaube ich) 'long int' 32 Bit auf 64-Bit-Windows ist, so dass die Schleife niemals enden wird. Sie sollten den Typ von "i" in "size_t" ändern, um sicherzustellen, dass er für jeden Array-Index groß genug ist. Ich habe keine Ahnung, ob das das einzige Problem ist. –

+0

Die Sache ist, dass es über hundert Zahlen ausdruckt, und dann gibt es eine Zugriffsverletzung, so scheint es, dass es das Limit nicht erreicht. – Jordi

Antwort

3

Es ist wahrscheinlich eines der folgenden Probleme:

  • long int ist 32-Bit: dass Ihr Maximalwert bedeuten ist 2147483647, und sizeof (double) * 536870912> = 2147483647 (ich weiß nicht weiß wirklich, ob das Sinn hat, hängt wahrscheinlich davon ab, wie der Compiler funktioniert)
  • Ihre Zuweisung schlägt fehl.

Ich schlage vor, Sie den folgenden Code zu testen:

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

} 

Schnitt: diesen Code verwenden, ich einen einzigen Block von 9GB nur erreicht zuzuteilen.

Verwandte Themen