Używam procedur wykrywania wycieków pamięci Visual CRT od <crtdbg.h>
; gdy zgłoszę _CrtDumpMemoryLeaks
jeden przydział jest zgłaszane konsekwentnie na każdym wywołaniu programu:Dlaczego funkcja _CrtSetBreakAlloc nie może wywołać punktu przerwania?
{133} normal block at 0x04F85628, 56 bytes long.
Data: < > B0 81 F8 04 B0 81 F8 04 B0 81 F8 04 CD CD CD CD
Adres zmienia ale {133}
jest zawsze taka sama.
Według instrukcji MSDN dotyczących How to set breakpoints on memory allocation number, powinienem być w stanie ustawić punkt przerwania na 133. alokacji z tej rozmowy:
_CrtSetBreakAlloc(133);
i mogę też sprawdzić w oknie zegarka że {,,msvcr90d.dll}_crtBreakAlloc
rzeczywiście jest ustawiony na 133 Po zakończeniu programu raport o wycieku nadal zawiera numer 133 (wraz z pewnymi wyższymi liczbami), ale nie występuje punkt przerwania. Dlaczego może to być i jak uzyskać punkt przerwania?
Potencjalnie istotne informacje:
- VS2008, przy użyciu „wielowątkowe debugowania DLL” CRT
- Moje kodu jest DLL, który jest ładowany przez produkt innej firmy
- „normalne” wartości graniczne działa dobrze; krok po kroku działa dobrze;
__asm int 3
też działa dobrze. - Żadna inna wartość dla
_crtBreakAlloc
powoduje przerwania albo (nie te Próbowałem tak) 133 jest najniższy numer w raporcie szczelności
Sądzę, że to jest korzyść z umieszczenia punktu przerwania na samym początku programu, a następnie ustawienie {,, msvcr90d.dll} _crtBreakAlloc do 133 zamiast wywoływania _CrtSetBreakAlloc (133); chociaż nie jestem pewien, czy ta uwaga ma zastosowanie w twojej sytuacji. :) W każdym razie, cieszę się, że został rozwiązany. – Gyuri
FYI, jednym prostym (i powszechnym) sposobem, w jaki może się to zdarzyć, jest to, że alokacja jest statyczna. Na przykład. zrobiłeś 'std :: vector' w zakresie pliku. – imallett