zoukankan      html  css  js  c++  java
  • 关于delete的一个小问题

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

      没学到的知识点:

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

    场景:

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

      

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

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

      

      

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

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

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

  • 相关阅读:
    洛谷 P1119 灾后重建
    [NOIP 2011] 观光公交
    AtCoder Beginner Contest 071 D
    UOJ #228. 基础数据结构练习题
    bzoj 3673&3674: 可持久化并查集 by zky
    bzoj 2427: [HAOI2010]软件安装
    都市环游
    poj2299——Ultra-QuickSort
    poj1958——Strange Towers of Hanoi
    洛谷 P4139 上帝与集合的正确用法
  • 原文地址:https://www.cnblogs.com/GnibChen/p/8638254.html
Copyright © 2011-2022 走看看