关于delete的一个小问题
以前一直有一个概念:析构函数是用来回收释放内存的,导致了我一直以为析构函数就是用来释放该对象的内存,其实不然。析构函数用来释放的是在对象中new出来的内存,前提是对象已经有了,也就是说对象本身占有的内存不是由析构函数释放的。
没学到的知识点:
delete 有两个层次:
1、先调用析构函数完成类成员的释放,比如类有成员指针指向了堆上内存。需要在析构函数中释放这块内存。
2、然后free整个对象的内存。
场景:
公司有个同事写了一个单例对象,并通过函数放回对象的地址:
这个单例类的析构函数定义为空。
然后有个同事在调用时delete返回的地址,导致多线程时double free了
注:上面那个注释时后来加的。
这里的delete调用析构函数,析构函数为空意味着什么都不做,我觉得没什么问题,反正内存没释放。忽略了虽然析构函数没什么时都没干,但是delete还是会释放对象地址的内存啊。
谢谢公司的老大哥的指点。