Mam program, w którym, częściowo do rejestrowania informacji, wypisuję nazwy niektórych klas, ponieważ są one używane (konkretnie dodaję wpis do dziennika mówiącego wzdłuż linii Messages::CSomeClass transmitted to 127.0.0.1
). Czynię to z kodu podobnego do poniższego:Wycieki pamięci po użyciu typeinfo :: name()
std::string getMessageName(void) const {
return std::string(typeid(*this).name());
}
I tak, zanim ktokolwiek zwraca go, zdaję sobie sprawę, że wyjście typeinfo::name
zależy od konkretnej implementacji.
Według MSDN
type_info::name
funkcji członka zwracaconst char*
do nul ciąg reprezentujący postaci czytelnej dla człowieka nazwę typu. Wspomniana pamięć jest przechowywana w pamięci podręcznej i nigdy nie powinna być deallocated.
Jednak po wyjściu z programu w debugerze, każde "nowe" użycie typeinfo::name()
pojawia się jako wyciek pamięci. Jeśli wysyłam informacje dla 2 klas, otrzymuję 2 wycieki pamięci i tak dalej. Wskazuje to, że dane w pamięci podręcznej nigdy nie są zwalniane.
Chociaż nie jest to poważny problem, wygląda na brudny, a po długiej sesji debugowania może z łatwością ukryć rzeczywiste wycieki pamięci.
Rozejrzałem się i znalazłem kilka przydatnych informacji (jedna odpowiedź SO daje interesujące informacje o how typeinfo may be implemented), ale zastanawiam się, czy pamięć ta powinna być normalnie uwolniona przez system, czy też jest coś, co mogę zrobić, aby "nie zauważam" nieszczelności podczas debugowania.
Mam plan awaryjny, który polega na kodowaniu metody getMessageName
i nie poleganiu na typeinfo::name
, ale chciałbym wiedzieć, czy jest coś, co przeoczyłem.
Ewentualnie istotne? [http://connect.microsoft.com/VisualStudio/feedback/details/106937/memory-leaks-reported-by-debug-crt-inside-typeinfo-name](http://connect.microsoft.com/VisualStudio/ feedback/details/106937/memory-leaks-reported-by-debug-crt-inside-typeinfo-name). Z jakiego kompilatora korzystasz? Może wypróbujesz inny kompilator, jeśli to możliwe? –
Ponieważ jest buforowany, nie martw się o to. – Jagannath
@jagansai: Nie martwię się o sam wyciek, ponieważ wpływa on tylko na wyjście debuggera na wyjściu aplikacji - martwię się, że może ukryć * prawdziwe * wycieki pamięci. I wygląda na brudny. Naprawdę lubię czysty wydruk debuggera :) – icabod