smart pointer virtual destructor

    技术2022-05-19  18

    今天遇到一个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*)的地方。

     

    好吧,这个东西就是,拿出来有意识的一看肯定知道怎么回事,一旦代码飙起来了,还能保持不出错,的确是需要更加扎实的基本功了。


    最新回复(0)