首先摆明观点,可使用,但必须是new产生的对像,注意,这里数组也不可以。
在C++ FAQ看到该问题的阐述,原文如下:

[16.15] Is it legal (and moral) for a member function to say delete this?
As long as you’re careful, it’s OK for an object to commit suicide (delete this).
Here’s how I define “careful”:

  1. You must be absolutely 100% positive sure that this object was allocated via new (not by new[], nor by placement new, nor a local object on the stack, nor a global, nor a member of another object; but by plain ordinary new).
  2. You must be absolutely 100% positive sure that your member function will be the last member function invoked on this object.
  3. You must be absolutely 100% positive sure that the rest of your member function (after the delete this line) doesn’t touch any piece of this object (including calling any other member functions or touching any data members).
  4. You must be absolutely 100% positive sure that no one even touches the this pointer itself after the delete this line. In other words, you must not examine it, compare it with another pointer, compare it with NULL, print it, cast it, do anything with it.
    Naturally the usual caveats apply in cases where your this pointer is a pointer to a base class when you don’t have a virtual destructor.

上面提到了“自杀”时需要注意4点:
1. 对象是通过最简单的new运算符分配到空间的,而非new[],也不是内存定位的new(比如new§ Q),更不是栈上面的、全局的,最后该对象不能是另外一个对象的成员;
2. 负责自杀的成员函数应该是该对象最后调用的成员函数;
3. 负责自杀的成员函数在delete this;这一条语句后面不能再去访问对象的其它成员;
4. 对象自杀后,不能再去访问this指针;
最后说明了一句,如果this指针指向一个不具有虚析构函数的基类对象,往往会出现警告。

对于上面要注意的4点,有的即使不遵守也不会出现警告或者错误,但是会有安全隐患。因为delete this;语句得到调用后,指向该对象的指针就是野指针了,这时候内存中的内容可能保持完整并且可以被访问,使得数据仍然有效,但是安全的编码风格应该保证内存释放后不能再对它进行访问,避免潜在风险。

C++ 类自杀 delete this相关推荐

  1. C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765

    https://www.zhihu.com/question/30838092/answer/49623765 C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? 代码如下 ...

  2. Java File类boolean delete()方法(带示例)

    文件类布尔型delete() (File Class boolean delete()) This method is available in package java.io.File.delete ...

  3. 关于k8s存储类的“Delete“和“Retain“

    目录 关于k8s存储类 准备基础环境 开始操作(nfs存储类部分) persistentVolumeReclaimPolicy: Delete persistentVolumeReclaimPolic ...

  4. java 文件删除不了File类的delete方法删不掉文件的原因分析

    File directory = null;String path = tempPath + File.separator + fileName;directory = new File(path); ...

  5. 阿托替抗焦虑药的交互式假设检验

    Python and atoti: experimentation in data analytics Python和Atoti:数据分析实验 Crafting an analytical model ...

  6. 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?...

    五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...

  7. MFC操作Excel2003的CRange类的Copy函数和Delete函数实现方法

    一.CRange类的Copy函数实现方法 具体步骤: 1.实例化一个CRange类对象range1,关联你要拷贝的区域: 2.实例化一个CRange类对象range2,关联你要将要粘贴到的区域: 3. ...

  8. JAVA的StringBuffer类

    StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...

  9. MFC类结构-1、CObject类

    CObject是"MFC类之母",由它派生出庞大的类体系.CObject并不是对整个类体系进行语义抽象的结果,它只为所有派生类定义几种功能特性.由于这几项功能应用于MFC的大部分类 ...

最新文章

  1. 争自动驾驶领头羊还是确保技术安全?欧美选择不同
  2. microsoft visual c++全家桶_Adobe 2020 MAC全家桶最新版不闪退
  3. 基于visual Studio2013解决C语言竞赛题之1010计算
  4. Altium AD20批量修改丝印大小、更改丝印字体、丝印显示中文、更改位号丝印 相对元件的位置
  5. 数据流图技术相关基础知识
  6. Android Activity和Fragment的生命周期图
  7. session的创建方式
  8. SEO工具,站长必备
  9. CCF计算机职业资格认证数字排序问题
  10. 电影光盘的vob格式视频如何转换成mp4格式
  11. 嵌套iframe页面做打印去掉页眉页脚
  12. 2023跨境出海指南:韩国网红营销白皮书
  13. 2011020敏捷培训
  14. Unity3D 文字线条效果
  15. 股票配对交易策略-最小距离法
  16. 浅析 集束搜索(Bean Search) 算法
  17. ISTQB认证考试通过秘籍 问题一、ISTQB是什么?有哪些分类? ISTQB(International Software Testing Qualification Board)是国际唯一权威的软
  18. 01【股票初级】-【找准入场时机】投资五大流派,好公司投资法,判断单只股票是否便宜?如何找准时机入场?
  19. sed 删除/增加文件的某一行
  20. system verilog断言学习笔记

热门文章

  1. ** (java:10104): WARNING **: Could not open X display (MobaXterm无法打开smartgit)
  2. X线DR医学图像 --- DR医用滤线栅及摩尔纹详解 (二) 摩尔纹的产生机理
  3. HTML精仿ios相册,高仿ios相册地图功能
  4. w10系统mysql_W10如何搭建MySQL环境,W10搭建MySQL环境的方法
  5. EasyExcel 使用
  6. linux多线程:自旋锁
  7. 数据库:(园林绿化工程施工及验收规范)
  8. 2019年年末区块链+公益开始落地,2020年区块链这些应用场景会实现吗?
  9. 安装Flash9时,提示“Error 1904.Module的解决办法
  10. ubuntu terminal快捷键