今天遇到一个smart pointer没有在destructor上加virtual 导致delete时候assert的问题。
不佳virtual导致继承的class的destructor没有被调用,这个没问题,里面内存没有被正确释放,这个有点意思。
这样一个代码中,GeometryResource调过来的delete this传的pointer 地址会比实际的要偏移一个sizeof(void*),也就是数据首的virtual table pointer的大小。
因为没有多态,导致进入RefOb时候,指针被指向RefObj的首地址,也就是比实际偏移sizeof(void*)的地方。
好吧,这个东西就是,拿出来有意识的一看肯定知道怎么回事,一旦代码飙起来了,还能保持不出错,的确是需要更加扎实的基本功了。