在构造函数中调用析构或者delete的区别
本文最后更新于:3 个月前
偶然在一篇面经中看到了这个屌问题,因此做了个测试来验证一下不同情况下会发生什么。测试代码如下:
1 |
|
对象在堆上
在构造函数中调用 delete this
1 |
|
在debug模式下运行结果:
在release模式下运行结果:
解释:delete包含两个操作,首先调用对象的析构函数,其次free将相关内存释放掉。在debug模式下,会将free掉的内存统一用dd来覆盖掉,作为一种mask标记,如果别的指针指向并读取了相关内存就会报错。在调试模式下打断点结果如下:
但是在release模式下free不会重写内存,只会将该内存块还给内存池。因此如果这段内存没有被其它线程申请,那么可以读到原始值的。
在构造函数中调用析构函数
1 |
|
在debug模式和release模式下输出都是正常的:
这是由于类中数据类型都是POD(plain old data)的,因此析构函数就是个空函数,直接忽略,输出正常。
对象在栈上
这里不区分debug和release了,结果是一样的。
在构造函数中调用 delete this
1 |
|
结果直接崩了,报错:
哦哦,对,这个不是new出来的,那如果直接free(this)呢?还是崩了。因此对栈上的东西手动去做delete或者free本来就是错误的,没什么讨论的意义。
在构造函数中调用析构函数
效果正常,和上面的解释一样,析构函数属于什么都没做,可以正常输出,无论堆栈。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!