Nếu bạn đang gọi _CrtDumpMemoryLeaks()
ở cuối chức năng chính, hành vi được mong đợi, vì mp_data
sẽ bị xóa sau khi _CrtDumpMemoryLeaks()
được gọi.
Bạn sẽ cần gọi _CrtDumpMemoryLeaks()
sau lần hủy cuối cùng của đối tượng tĩnh đã được gọi (hoặc đúng hơn trong lần hủy cuối cùng sau khi bộ nhớ đã được giải phóng) nếu bạn không muốn thấy những rò rỉ này. thử nó).
Phương pháp sạch hơn là để phân bổ tất cả các đối tượng tĩnh của bạn trên heap thay vì (vào đầu main
), và deallocate họ vào cuối main
, và sau đó bạn có thể gọi _CrtDumpMemoryLeaks()
và sẽ không thấy bất kỳ rò rỉ bộ nhớ.
Các đối tượng tĩnh FYI với các hàm tạo và hàm hủy được coi là anyways xấu, bởi vì thứ tự mà chúng được xây dựng/desctructed không xác định, và vì các đối tượng tĩnh thường giới thiệu lỗi mà không thể gỡ lỗi dễ dàng.
Chỉnh sửa liên quan đến bình luận của Andrey: Bạn có thể thử để tắt cuộc gọi tự động để _CrtDumpMemoryLeaks
bằng cách gọi _CrtSetDbgFlag để bỏ đặt _CRTDBG_LEAK_CHECK_DF
cờ. Nếu điều đó làm việc, bạn có thể thêm một đối tượng tĩnh gọi _CrtDumpMemoryLeaks()
trong destructor của nó. Để đảm bảo rằng đối tượng này bị hủy cuối cùng, bạn có thể sử dụng #pragma init_seg(compiler) directive.
Không có đầu mối nếu điều này có hiệu quả ... ngoài ra, tất cả các giải pháp khác rất có thể sẽ yêu cầu bạn sửa đổi thư viện ITK (có thể là thư viện nguồn mở sau này ?!).
Đây có thể là lỗi Visual Studio. Xem các bình luận dưới câu trả lời được chấp nhận [ở đây] (http://stackoverflow.com/questions/2204608/does-c-call-destructors-for-global-and-class-static-variables). –
Không, đó không phải là lý do. Tôi đã xác minh trong trình gỡ lỗi mà '~ A()' thực sự được gọi. – Andrey