2012-11-01 38 views
5

Tôi đang cố gắng hiểu cách sử dụng _CrtCheckMemory để theo dõi hỏng heap trong ứng dụng Windows mà tôi đang làm việc. Có vẻ như tôi không thể trả lại số false. Đây là mã thử nghiệm của tôi:_CrtCheckMẫu sử dụng ví dụ

int* test = new int[1]; 
for(int i = 0; i < 100; i++){ 
    test[i] = 1; 
} 
assert(_CrtCheckMemory()); 

Trong mã ở trên, _CrtCheckMemory() trả về true. Tôi đang chạy trong chế độ gỡ lỗi. Tôi cần làm gì khác để có được một ví dụ đơn giản về việc gắn cờ một vấn đề?

Trả lời

6

Cần thêm một bước, bạn phải thuyết phục trình biên dịch thay thế toán tử mặc định mới bằng trình phân bổ gỡ lỗi. Chỉ trình phân bổ gỡ lỗi mới tạo ra các vùng "không có đất" phát hiện một hoặc ghi đè lên khối heap. Đó là nguy hiểm, mã được biên dịch với phân bổ ban đầu sẽ không kết hợp tốt với mã không phải. Vì vậy, nó buộc bạn phải chọn tham gia một cách rõ ràng.

Thực hiện tốt nhất trong tệp tiêu đề được biên dịch trước (mặc định là stdafx.h) để bạn có thể chắc chắn rằng tất cả mã sử dụng trình phân bổ gỡ lỗi. Như thế này:

#ifdef _DEBUG 
# define _CRTDBG_MAP_ALLOC 
# define _CRTDBG_MAP_ALLOC_NEW 
# include <crtdbg.h> 
# include <assert.h> 
#endif 

Các macro CRTDBG nhận được() chức năng và nhà khai thác mới thay thế malloc.

Hãy cẩn thận rằng mã của bạn như được đăng sẽ kích hoạt một chẩn đoán khác trước. Trên Windows Vista trở lên, Windows heap allocator sẽ phàn nàn đầu tiên vì mã đã phá hủy tính toàn vẹn của Windows heap. Làm cho ghi đè lên bộ lọc bit bằng cách lập chỉ mục chỉ đến, ví dụ: 2.

+0

Hmmm. Thêm công cụ biên dịch trước của bạn vào stdafx.h và một dự án phụ thuộc, và vẫn không dừng sau khi mảng của tôi ghi đè lên. Tôi sẽ gãi đầu của tôi về điều này một chút. Rõ ràng có cái gì đó gọi là gflags mà cũng có thể giúp tôi với điều này. – morgancodes

+0

Tôi đã kiểm tra điều này trước khi đăng, sử dụng mã của bạn. Làm việc tốt. Gflags rất hữu ích nếu bạn sử dụng các công cụ khác, như umhd.exe –

+0

Cảm ơn bạn. Thiết lập một dự án mới, chết đơn giản chỉ để tôi có thể thấy _CrtCheckMemory này thực sự hoạt động. – morgancodes

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