关于delete的一个小问题

  以前一直有一个概念:析构函数是用来回收释放内存的,导致了我一直以为析构函数就是用来释放该对象的内存,其实不然。析构函数用来释放的是在对象中new出来的内存,前提是对象已经有了,也就是说对象本身占有的内存不是由析构函数释放的。

  没学到的知识点:

   delete 有两个层次:
   1、先调用析构函数完成类成员的释放,比如类有成员指针指向了堆上内存。需要在析构函数中释放这块内存。
   2、然后free整个对象的内存。

场景:

  公司有个同事写了一个单例对象,并通过函数放回对象的地址:

  

  这个单例类的析构函数定义为空。

  然后有个同事在调用时delete返回的地址,导致多线程时double free了

  

  

  注:上面那个注释时后来加的。

    这里的delete调用析构函数,析构函数为空意味着什么都不做,我觉得没什么问题,反正内存没释放。忽略了虽然析构函数没什么时都没干,但是delete还是会释放对象地址的内存啊。

  谢谢公司的老大哥的指点。

原文地址:https://www.cnblogs.com/GnibChen/p/8638254.html