2013-07-30 40 views
7

Tôi đang chạy mã này, được biên dịch trên 64 bit vC++ 2005, trên Windows Server 2008 R2 với 32GB. Có một sự vi phạm truy cập bên trong vòng lặp for.Phân bổ bộ nhớ nhiều hơn 4GB trong hệ thống 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; 
} 

Vì vậy, nếu không có ngoại lệ trong cặp đôi mới [536870912], tại sao tôi bị vi phạm quyền truy cập khi thực hiện chuyển nhượng trên một vị trí mảng cụ thể?

Một điểm đáng lưu ý khác là chương trình này đã được thử nghiệm thành công trên máy tính khác.

+1

Cam kết quá mức cũng có thể là thủ phạm. – syam

+6

Một vấn đề là (tôi nghĩ) 'int' dài là 32 bit trên Windows 64-bit, do đó vòng lặp sẽ không bao giờ chấm dứt. Bạn nên thay đổi kiểu 'i' thành' size_t' để chắc chắn nó đủ lớn cho bất kỳ chỉ mục mảng nào. Tôi không biết đó có phải là vấn đề duy nhất hay không. –

+0

Vấn đề là nó in ra trên một trăm số và sau đó có một sự vi phạm truy cập, do đó, có vẻ như nó không đạt đến giới hạn. – Jordi

Trả lời

3

Nó có lẽ là một trong những vấn đề sau đây:

  • int dài là 32-bit: có nghĩa là giá trị lớn nhất của bạn là 2147483647, và sizeof (double) * 536.870.912> = 2147483647. (tôi không thực sự biết nếu điều đó có ý nghĩa. Nó có thể phụ thuộc vào cách thức làm việc của compiller)
  • Phân bổ của bạn không thành công.

Tôi đề nghị bạn kiểm tra các đoạn mã sau:

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

} 

Biên tập: Sử dụng mã này, tôi chỉ đạt được phân bổ một khối duy nhất của 9GB.