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