2010-03-02 53 views
6

Môi trường dev của tôi là VS2008, DX9, Windows XP. Tôi cố gắng thêm xử lý bảo vệ vào bộ nhớ ngoài. Khi malloc trả về NULL, tôi sẽ trang một số tài nguyên vào đĩa và giải phóng tài nguyên trong bộ nhớ.Tại sao malloc luôn trả về NULL

Nhưng đôi khi, malloc luôn trả về NULL, ngay cả khi tôi giải phóng hầu hết tài nguyên và quá trình sử dụng bộ nhớ và kích thước VM chỉ 800MB trong trình quản lý tác vụ.

Tôi nghĩ rằng việc sử dụng malloc để phân bổ 88 byte sẽ ổn, khi sử dụng bộ nhớ quá trình chỉ 800MB. Nhưng malloc luôn trả về NULL.

Đây có phải là phân mảnh bộ nhớ không? Nó không giống như vậy, vì quá trình sử dụng bộ nhớ không quá nhiều.

alt text http://i.imagehost.org/0267/Snap2.jpg

+1

Bạn có thể cho chúng tôi biết một số mã không? –

+0

Exe được khởi chạy và đính kèm bởi trình sửa lỗi VS. – Buzz

+0

void * AllocCRT (size_t size) { return malloc (size); } Cách sử dụng Mem: 644,088K VM Kích thước: 671,064K – Buzz

Trả lời

2

Bạn nói phân mảnh bộ nhớ và đó chắc chắn sẽ đoán đầu tiên của tôi. Hãy thử tải xuống ứng dụng this. Nó được gọi là Địa chỉ Màn hình không gian và sẽ có thể hiển thị cho bạn nếu sự cố phân mảnh của nó.

+1

Màn hình này sẽ phân tích ông xử lý không gian địa chỉ như được thấy bởi hệ điều hành, trong khi 'malloc' trong MSVC hoạt động thông qua Windows Heap API. Nó không cấp phát bộ nhớ trực tiếp từ hệ thống và không trả lại trực tiếp cho hệ thống. Điều này có nghĩa là Monior này sẽ không thể cho bạn thấy bất cứ điều gì. Đối với các Màn hình như vậy, toàn bộ vùng heap sẽ giống như một hộp đen không thể xuyên thủng của bộ nhớ được phân bổ mãi mãi. – AnT

+0

@AndreyT: Tôi nghĩ rằng 'sẽ không cho bạn thấy bất cứ điều gì' là một chút mạnh mẽ. Quá trình heap sử dụng không gian địa chỉ người dùng để bạn có thể thấy khi nào đã hết; điều này không nhất thiết có nghĩa là malloc sẽ không thể cấp phát bộ nhớ mà heap đã được bảo lưu. Những gì nó nên như vậy là khi có không gian địa chỉ miễn phí mà heap sẽ có thể yêu cầu nếu nó cần phải cấp phát bộ nhớ nhiều hơn nó đã được dành riêng. –

2

Nó có thể là phân mảnh không gian địa chỉ ảo. Một cách để kiểm tra là gọi HeapCompact(GetProcessHeap(), 0). Nếu điều đó giải phóng đủ bộ nhớ, thì đó là nguyên nhân có thể xảy ra.

Một nguyên nhân tương tự khác sẽ được khởi chạy từ trình gỡ lỗi; làm cho Windows sử dụng heap gỡ lỗi, có hành vi bộ nhớ thực sự xấu trong một khoảng thời gian dài. Để tắt hành vi đó, hãy đặt _NO_DEBUG_HEAP=1 trong môi trường và chạy.

0

Một khả năng khác là có thể có lỗi trong chương trình của bạn. Bạn nghĩ rằng bạn đang yêu cầu 88 byte, nhưng có thể bạn đang truyền một biến chưa được khởi tạo và yêu cầu hàng trăm megabyte. Hoặc có lẽ một cái gì đó bạn đã làm trước đó trên chạy một bộ đệm và bị hỏng heap, gây malloc() thất bại mãi mãi sau đó.

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