2012-01-30 35 views
23

Tôi đang viết mã có rất nhiều mảng 1 chiều là 1 & 2 chiều. Tôi đã nhận "lỗi: không thể phân bổ khu vực" và tôi nghĩ rằng nó bởi vì quá nhiều bộ nhớ được phân bổ. Tôi sử dụng chức năng "malloc" và "miễn phí", nhưng tôi không chắc chắn rằng tôi đang sử dụng chúng một cách đúng đắn. Có lẽ bạn biết nơi tôi có thể nhìn thấy ví dụ tốt về quản lý bộ nhớ trong C?Làm cách nào để giải phóng bộ nhớ trong C?

như vậy .. Tôi chỉ cố gắng để có được một công việc và thuật toán cho bây giờ mã này chỉ là chức năng sau khi chức năng ..

//memory allocation for 1D arrays 
buffer = malloc(num_items*sizeof(double)); 

//memory allocation for 2D arrays 
double **cross_norm=(double**)malloc(150 * sizeof(double *)); 
for(i=0; i<150;i++) 
    { 
     cross_norm[i]=(double*)malloc(num_items*sizeof(double)); 
    } 

    //code 
Window(N, window_buffer); 
STFTforBMP(buffer,N,f, window_buffer); 
getMagnitude(buffer,f, N, magnitude); 
calculateEnergy(flux,magnitude, f); 
calculateExpectedEnergy(expected_flux, candidate_beat_period, downbeat_location, f); 
calculateCrossCorrelation(cross, flux, expected_values, f); 
findLargestCrossCorrelation(&cross_max, cross, f); 
normalizeCrossCorrelation(cross_norm, &cross_max, cross, f); 
    ............... 

Làm thế nào tôi nên sử dụng free chức năng?

+6

Có lẽ nó sẽ mang tính xây dựng hơn để cho chúng ta thấy những gì bạn đã cố gắng? – cnicutar

+2

hiển thị mã của bạn. – Pheonix

+0

bạn nên cung cấp ví dụ về những gì bạn làm. nếu không câu hỏi của bạn chỉ là quá chung chung để trả lời ngoài: đọc các thông số kỹ thuật. – akira

Trả lời

32

Bạn phải free() bộ nhớ được phân bổ theo thứ tự đảo ngược chính xác về cách được phân bổ theo cách sử dụng malloc().

Lưu ý rằng Bạn chỉ nên giải phóng bộ nhớ sau khi đã thực hiện xong việc sử dụng con trỏ được phân bổ.

phân bổ bộ nhớ cho mảng 1D:

buffer = malloc(num_items*sizeof(double)); 

nhớ deallocation cho mảng 1D:

free(buffer); 

phân bổ bộ nhớ cho mảng 2D:

double **cross_norm=(double**)malloc(150 * sizeof(double *)); 
    for(i=0; i<150;i++) 
    { 
     cross_norm[i]=(double*)malloc(num_items*sizeof(double)); 
    } 

nhớ deallocation cho mảng 2D:

for(i=0; i<150;i++) 
    { 
     free(cross_norm[i]); 
    } 

    free(cross_norm); 
24

Bạn thực sự không thể tự do "bộ nhớ" trong C, theo nghĩa bộ nhớ được giải phóng khỏi quá trình quay lại OS ... khi bạn gọi malloc(), thời gian chạy libc cơ bản sẽ yêu cầu từ HĐH một vùng nhớ. Trên Linux, điều này có thể được thực hiện mặc dù một cuộc gọi tương đối "nặng" như mmap(). Khi vùng bộ nhớ này được ánh xạ tới chương trình của bạn, có một thiết lập danh sách liên kết được gọi là "cửa hàng miễn phí" quản lý vùng bộ nhớ được cấp phát này. Khi bạn gọi malloc(), nó sẽ nhanh chóng xem xét mặc dù các cửa hàng miễn phí cho một khối bộ nhớ miễn phí ở kích thước yêu cầu. Sau đó nó điều chỉnh danh sách liên kết để phản ánh rằng đã có một đoạn bộ nhớ được lấy ra khỏi nhóm bộ nhớ được cấp phát ban đầu. Khi bạn gọi free(), khối bộ nhớ được đặt trở lại trong cửa hàng miễn phí dưới dạng nút danh sách được liên kết cho biết đó là một bộ nhớ có sẵn.

Nếu bạn yêu cầu nhiều bộ nhớ hơn bộ nhớ trong cửa hàng miễn phí, thời gian chạy libc sẽ yêu cầu bộ nhớ nhiều hơn từ hệ điều hành đến giới hạn khả năng cấp phát bộ nhớ cho các quy trình đang chạy. Khi bạn giải phóng bộ nhớ, nó không được trả lại cho hệ điều hành ... nó thường được tái chế vào cửa hàng miễn phí, nơi nó có thể được sử dụng một lần nữa bởi một cuộc gọi khác tới malloc(). Do đó, nếu bạn thực hiện nhiều cuộc gọi tới malloc()free() với các yêu cầu kích thước bộ nhớ khác nhau, theo lý thuyết, có thể gây ra tình trạng gọi là "phân mảnh bộ nhớ", nơi có đủ dung lượng trong cửa hàng miễn phí để phân bổ khối bộ nhớ được yêu cầu của bạn , nhưng không đủ liền kề không gian cho kích thước của khối bạn đã yêu cầu. Vì vậy, các cuộc gọi đến malloc() không thành công, và bạn đang có hiệu quả "out-of-bộ nhớ" mặc dù có thể có nhiều bộ nhớ có sẵn như là một tổng số byte trong các cửa hàng miễn phí.

+2

Có phải chỉ là tôi hay OP đó đang hỏi điều gì đó khác biệt và câu trả lời (mặc dù độc đáo) giải thích điều gì đó khác? –

+3

OP đã cập nhật câu hỏi của mình khi tôi đang gõ câu trả lời (tôi đoán để trả lời một số nhận xét) ... Tôi nghĩ câu trả lời của tôi có thể vẫn mang tính hướng dẫn ngay cả khi nó không trả lời rõ ràng câu hỏi được cập nhật của anh ấy. Câu hỏi ban đầu của anh ta không có mã và về cơ bản anh ta đang sử dụng 'malloc' và' free', nhưng vẫn kết thúc bằng một lỗi "không thể phân bổ vùng". Nó nghe như tôi có thể phân mảnh bộ nhớ, vì vậy tôi nghĩ đây có thể là một câu trả lời hay. – Jason

+0

Tôi hiểu rồi. đuợc. Đó là một lời giải thích tốt đẹp mặc dù câu hỏi đã thay đổi làm cho nó cảm thấy ra khỏi vị trí. Anyways bạn có 1 của tôi cho các nỗ lực. –

Các vấn đề liên quan