Jeśli wywołasz _CrtDumpMemoryLeaks()
na końcu głównej funkcji, oczekiwane jest zachowanie, ponieważ mp_data
zostanie usunięte po wywołaniu _CrtDumpMemoryLeaks()
.
Musisz wywołać _CrtDumpMemoryLeaks()
po wywołaniu ostatniego destruktora statycznych obiektów (lub raczej w ostatnim destruktorze po zwolnieniu pamięci), jeśli nie chcesz widzieć tych przecieków (dość trudne zadanie, nie zrobiłbym tego Spróbuj).
Odkurzacz podejście jest przeznaczyć wszystkie swoje statycznych obiektów na stercie zamiast (na początku main
) i zwalnianie ich na końcu main
, a następnie można nazwać _CrtDumpMemoryLeaks()
i przyzwyczajenie widać żadnych wycieków pamięci.
Obiekty statyczne FYI z konstruktorami i destruktorami są uważane za złe, ponieważ kolejność, w jakiej są konstruowane/usuwane, nie jest deterministyczna, a z tego powodu statyczne obiekty często wprowadzają błędy, które nie mogą być łatwo debugowane.
Edytuj dotyczące komentarzu Andrey za: Można spróbować wyłączyć automatyczne wywołanie _CrtDumpMemoryLeaks
wywołując _CrtSetDbgFlag aby rozbroić flagę _CRTDBG_LEAK_CHECK_DF
. Jeśli to działa, możesz dodać statyczny obiekt, który wywołuje _CrtDumpMemoryLeaks()
w swoim destruktorze. Aby mieć pewność, że obiekt ten zostanie zniszczony jako ostatni, można użyć wartości #pragma init_seg(compiler) directive.
Nie ma pojęcia, czy to zadziała ... poza tym wszystkie inne rozwiązania najprawdopodobniej będą wymagały modyfikacji biblioteki ITK (co powinno być możliwe, w końcu jest to biblioteka typu open source ?!).
To może być błąd Visual Studio. Zobacz komentarze pod zaakceptowaną odpowiedzią [tutaj] (http://stackoverflow.com/questions/2204608/does-c-call-destructors-for-global-andclcl-static-variables). –
Nie, to nie jest powód. W debugerze zweryfikowałem, że naprawdę nazywa się '~ A()'. – Andrey