2009-10-14 7 views
8

Bir Win32 uygulamasında bellek sızıntılarını bulmaya çalışmak için instructions found here kullanıyorum. açıklandığı gibi, ben bir dosyaya (WINAPI _tWinMain içeren cpp dosyası) üstündekiVisual Studio 2008 (C++) bellek sızıntısı algılama dosya/yöntem konumunu göstermiyor - nasıl çalışır?

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

Çizgiler koymak ve sonra maalesef bilmiyorum ben

_CrtDumpMemoryLeaks(); 

eklendi WinMain çıkış noktasında sızıntıların satır numaralarını/yerlerini gör (fakat bir sızıntı listesi alırım).

Ben de WinMain başında
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
_CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_DEBUG); 

koyarak çalıştı - ve yine, hiçbir şanslar. Bu tuhafı buluyorum çünkü genellikle sızıntı bulmakta hiçbir sorun yaşamadım ya da otomatik olarak rapor vermem gerekiyordu.

Bu, yeni bir işveren için üzerinde çalıştığım çok eski, eski bir uygulama. Geçmişte standart VS sihirbazından çalıştım.

Sızıntıya neden olan kaynak hatları/yöntemleri nasıl edineceğinize dair herhangi bir öneriniz var mı? Ben yeniden tanımlanmasını kullanarak çalıştı

hiçbir başarı ile

Çok garip

DÜZENLEME -

I also tried visual leak detector:?.. (Ya da en azından "yeni" için hatlar

DÜZENLEME çağırır Aşağıdaki gibi yeni listeleniyor, ancak destek derlendiğinde hata alıyorum.

+0

Delici'yi deneyin. size yardım etmeli. –

cevap

6

Sızan kodun kullandığınızdan emin misiniz? CRT hata ayıklama rutinleri? Bu, malloc() veya new (LocalAlloc, GlobalAlloc, bazı özel blok ayırıcı, vb .'nin aksine) kullanılmasını gerektirir ve _DEBUG (Bence), CRT başlıkları dahil edildiğinde tanımlanmalıdır.

Kaynak hatlarının sızıntılara yol açabilmesi için, ayırmaların oluştuğu her yerde DEBUG_NEW tanımlamanız gerekir. Bunun nedeni, bunları izleyebilmek için, her bir ayırmanın, __FILE__ ve __LINE__'u içeren bir çağrı ile değiştirilmesi gerekir. Kod yerine new ait malloc kullanımlarını ayıklama eğer

#ifdef _DEBUG 
#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define new DEBUG_NEW 
#endif 

Bu malloc işlemez, muhtemelen bunun için de benzer bir büyü var: sihirbazından standart çözünürlüklü şöyle görünür.

Önceden derlenmiş üstbilgileri kullanıyorsanız, bunu önceden derlenmiş üstbilgi dosyasına koyabilirsiniz ve bu projedeki tüm kaynak dosyaları etkiler.

+0

Evet, globalalloc kullanılmıyor. Bu benim için çok garip. Yeni olanı tekrar eklemeyi ve neler olduğunu görmeyi deneyeceğim. – Tim

+0

Bunun benim problemlerimi çözeceğini sanıyordum, ancak projedeki destek malzemelerini derlerken boğuluyor. Sanırım destek sorunlarını bir şekilde ayırmam gerekecek. – Tim

+6

Ben de buna koştum. Bazı destek kütüphaneleri 'new 'operatörünü geçersiz kılar ve bu yüzden' upBUG_NEW 'tanımını * artırma üstbilgileri de dahil olmak üzere * veya en azından bir kısmını da dahil etmeniz gerekir. –