在調試某個程序的核心轉儲時,我發現它所包含的多態的對象失去了它的VPTr,並且我看到它指向NULL。爲什麼我的C++對象失去了VPTr
對象失去VPTr時可能發生什麼情況。
由於提前, Brijesh
在調試某個程序的核心轉儲時,我發現它所包含的多態的對象失去了它的VPTr,並且我看到它指向NULL。爲什麼我的C++對象失去了VPTr
對象失去VPTr時可能發生什麼情況。
由於提前, Brijesh
的內存已經丟棄,即東西改寫內存。
您通過調用delete或通過直接調用析構函數來銷燬它。這通常不會將vptr清空,它最終只會指向基類的vtable,但這取決於您的實現。
最有可能的情況下,1。如果你有一個具有記憶斷點調試器,如果你能可靠地重現該問題,上的vptr設置一個斷點記憶,看看有什麼修改。
可能有東西覆蓋了整個對象。這樣的事情:
memset(object, 0, sizeof(*object));
這是很好的,直到它用於與vptr的對象。
此構造不應用於任何具有非POD數據的類,而不應該用於具有v-tables的類。 – CashCow 2010-10-19 09:28:46
這可能是你正在試圖在你的對象的析構函數中使用v表。 v表在此時不可用。
這個對象是否至少實現了一個'virtual'函數?即使不這樣做,vptr也幾乎不會像NULL一樣(通常用於存儲'typeinfo')。 – 2010-10-19 07:16:05
你確定內存正在清理?這可能是由於你實施了[這種行爲](http://www.artima.com/cppsource/nevercall.html)。 – Keynslug 2010-10-19 07:26:26
你有從_Undefined Behavior_選擇的整個範圍 - 這是很多。 – sbi 2010-10-19 07:31:05