2011-12-17 53 views
9

Trong ứng dụng wxWidgets của tôi, trong khi chạy ở chế độ gỡ lỗi, tôi nhận được thông báo này trong Đầu ra của Visual Studio 2010. Ứng dụng chạy tốt, và tôi chỉ thấy điều này sau khi đóng nó.Phát hiện rò rỉ bộ nhớ

Rò rỉ bộ nhớ đã phát hiện!

Đối tượng bán phá giá ->

{9554} khối bình thường ở 0x003CDCC0, 44 byte dài.
Dữ liệu: < e n d> 20 C1 65 01 01 00 00 00 6E 00 00 00 9C CE 64 01

{9553} khối bình thường ở 0x003CDB58, 8 byte dài.

dữ liệu: < D e <> 44 BD 65 01 C0 DC 3C 00
{9552} khối bình thường tại 0x003CDC50, dài 48 byte.

dữ liệu: < e> A0 65 01 01 95 00 00 00 19 00 00 00 19 00 00 00

Object bãi hoàn chỉnh.

Trong chương trình của tôi, tôi không phân bổ rõ ràng bộ nhớ, tuy nhiên khung wxWidgets là. Tôi đã nhận được một tin nhắn như vậy lần đầu tiên, và không biết chính xác nguyên nhân của nó.

Làm cách nào để thoát khỏi rò rỉ bộ nhớ này?

+1

bài viết mã của bạn, tốt nhất là một chương trình tối thiểu tái tạo vấn đề. – user1071136

+0

Thật không may tôi không thể đăng một chương trình tối thiểu. Bởi vì, nó là một chương trình GUI với một số tệp và một khung công tác GUI. Tôi không biết điều gì đang gây ra điều này. Bởi vì tôi không có nơi nào được sử dụng 'new' hoặc' malloc'. –

+0

Tôi chỉ sợ bạn sẽ đoán được nhiều hơn câu trả lời :) – user1071136

Trả lời

24

Bạn chỉ cần thêm các dòng sau vào đầu chức năng chính của mình. Thêm cờ này, Visual Studio sẽ phá vỡ ở dòng đang tạo ra rò rỉ bộ nhớ.

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    _CrtSetBreakAlloc(9554); 
    _CrtSetBreakAlloc(9553); 
    _CrtSetBreakAlloc(9552); 

Đảm bảo bạn có đúng địa chỉ khối bình thường đối tượng vì chúng có thể thay đổi và đảm bảo bạn đang biên dịch trên _DEBUG.

Xem thêm: _CrtSetDbgFlag_CrtSetBreakAlloc Tham chiếu MSDN.

+1

Cảm ơn, Những gì thực sự làm việc cho tôi đã được thêm '_crtBreakAlloc = 9609;' như là một tuyên bố đầu tiên. Đối với wxWidgets tôi phải thêm nó vào hàm 'OnInit()' của ứng dụng chính. –

+2

Xin chào, bạn đã nghĩ ra sao với 9609? –

0

Có thể một số loại cá thể tĩnh vẫn được phân bổ theo khung. Cố gắng giải quyết nó với profiler như "devpartner".

+0

tin nhắn từ studio trực quan có thể được sử dụng để nhận trợ giúp không? –

+0

@VinayakGarg Có thể giúp, nhưng để sử dụng rất hạn chế. Dữ liệu 'Dữ liệu' được liệt kê trong thực tế là nội dung của địa chỉ bộ nhớ, theo đó bạn có thể đoán được bộ nhớ được sử dụng cho cái gì và đoán nó được cấp phát ở đâu. – fefe

+0

Anh ấy đang sử dụng cửa sổ, vì vậy Valgrind sẽ không hoạt động ở đây. –

0
  1. Không bao giờ chỉ 'giả định' rằng mã của bạn là bằng chứng rò rỉ bộ nhớ. Trừ khi bạn là một trong số các chương trình demi-gods, không ai miễn nhiễm khỏi việc có thể viết rò rỉ bộ nhớ.

  2. Bạn có thể sử dụng một công cụ như kiểm tra giới hạn (Từ Microfocus) để giúp xác định rò rỉ bộ nhớ vì nó sẽ cung cấp cho bạn một callstack. Báo cáo rò rỉ bộ nhớ bạn nhận được từ CRT gỡ lỗi chỉ cho bạn biết bộ nhớ bị rò rỉ tại một địa chỉ cụ thể. Một sản phẩm như kiểm tra giới hạn sẽ cung cấp cho bạn một callstack cho rằng rò rỉ bộ nhớ, cùng với rất nhiều goodies khác. Có những công cụ rò rỉ bộ nhớ khác trên thị trường, nhưng tôi sẽ không cố liệt kê chúng ở đây.

  3. Nếu bạn chắc chắn rò rỉ bộ nhớ là do 'wxWidgets', thì có lẽ bạn nên thông báo cho người viết thư viện đó và có lẽ họ sẽ sửa nó (Với các bước repro phù hợp).

+1

tôi không bao giờ nói mã của tôi là bằng chứng rò rỉ bộ nhớ, nó chỉ của tôi đã không được sử dụng mới hoặc malloc trong mã của tôi. Có lẽ tôi nên thử yêu cầu nó trên trang web wxWidgets. –

0

This wiki gợi ý thêm dòng sau vào mỗi tập tin nguồn mà bạn có, sau khi tất cả tiêu đề khác bao gồm nhân:

#ifdef __WXMSW__ 
    #include <wx/msw/msvcrt.h>  // redefines the new() operator 
#endif 

này sẽ dẫn đến rò rỉ được báo cáo khi chương trình của bạn kết thúc.

Cụ thể hơn, hãy đảm bảo bạn gọi ->Destroy() trên tất cả các đối tượng bạn tạo bằng cách sử dụng new (ngoại trừ có thể cửa sổ trên cùng của bạn).

0

Nếu vị trí của rò rỉ báo cáo của vs là cùng mỗi khi bạn có thể thiết lập một databreakpoint để xem khi bộ nhớ này đã được thay đổi và hy vọng tìm ra người được phân bổ bộ nhớ này