2010-10-19 39 views
6

Podczas debugowania jednego z podstawowych zrzutów programu natknąłem się na scenariusz, w którym jego obiekt zawierający, który jest polimorficzny, traci swój VPTr i widzę, że wskazuje na NULL.Dlaczego mój obiekt C++ traci swój VPTr

Co może być scenariuszem, gdy obiekt traci swój VPTr.

Dzięki z góry, Brijesh

+0

czy ten obiekt implementuje co najmniej jedną funkcję 'wirtualną'? nawet jeśli tak nie jest, jest małe prawdopodobieństwo, że vptr będzie "NULL", jak to jest (często) używane do przechowywania "typeinfo". –

+0

Czy jesteś pewien, że pamięć jest czyszczona? Przyczyną może być [to zachowanie] (http://www.artima.com/cppsource/nevercall.html), które zaimplementowałeś. – Keynslug

+0

Masz całą gamę _Undefined Behavior_ do wyboru - i to dużo. – sbi

Odpowiedz

6
  1. Pamięć została zniszczona, to znaczy coś nadpisałeś pamięć.

  2. Zniszczyłeś go, wywołując delete lub bezpośrednio wywołując destruktor. Zwykle nie NULL out vptr, po prostu kończy się na tym, że wskazuje na vtable klasy bazowej, ale to zależy od twojej implementacji.

Najprawdopodobniej sprawa 1. Jeśli masz debugger, który ma punkty przerwania pamięci i jeśli można wiarygodnie odtworzyć problem, należy ustawić punkt przerwania pamięci na vptr i zobaczyć, co się modyfikacji.

5

Prawdopodobnie coś nadpisało cały obiekt. Coś w tym stylu:

memset(object, 0, sizeof(*object)); 

co jest w porządku, dopóki nie zostanie użyte na obiekcie z vptr.

+0

Ta konstrukcja nie powinna być używana na żadnej klasie, która ma dane inne niż POD, a nie tylko te z v-tabelami. – CashCow

0

Możliwe, że próbujesz użyć v-table podczas destruktora obiektu. V-table nie jest obecnie dostępny.