2010-10-19 77 views
6

在調試某個程序的核心轉儲時,我發現它所包含的多態的對象失去了它的VPTr,並且我看到它指向NULL。爲什麼我的C++對象失去了VPTr

對象失去VPTr時可能發生什麼情況。

由於提前, Brijesh

+0

這個對象是否至少實現了一個'virtual'函數?即使不這樣做,vptr也幾乎不會像NULL一樣(通常用於存儲'typeinfo')。 – 2010-10-19 07:16:05

+0

你確定內存正在清理?這可能是由於你實施了[這種行爲](http://www.artima.com/cppsource/nevercall.html)。 – Keynslug 2010-10-19 07:26:26

+0

你有從_Undefined Behavior_選擇的整個範圍 - 這是很多。 – sbi 2010-10-19 07:31:05

回答

6
  1. 的內存已經丟棄,即東西改寫內存。

  2. 您通過調用delete或通過直接調用析構函數來銷燬它。這通常不會將vptr清空,它最終只會指向基類的vtable,但這取決於您的實現。

最有可能的情況下,1。如果你有一個具有記憶斷點調試器,如果你能可靠地重現該問題,上的vptr設置一個斷點記憶,看看有什麼修改。

5

可能有東西覆蓋了整個對象。這樣的事情:

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

這是很好的,直到它用於與vptr的對象。

+0

此構造不應用於任何具有非POD數據的類,而不應該用於具有v-tables的類。 – CashCow 2010-10-19 09:28:46

0

這可能是你正在試圖在你的對象的析構函數中使用v表。 v表在此時不可用。

相關問題