在类的成员函数中能不能使用delete this?

答:能!在某些设计模式中需要赋予对象自我销毁的能力,这个时候就可以使用delete this将该对象的this指针进行删除,但是需要确定的是不能在访问该对象的数据成员,或需要调用访问这些成员的函数,虽然还是可以访问,但数据已经是不安全的。

使用delete this的注意事项:
1.通常情况下delete this 往往是跟对象指针一起使用,确保对象占用的内存是在heap(堆)上,即该对象使用new生成, 因为delete 往往跟new是成对出现的。
2.delete this 之后,不能再访问this指针和该对象的数据成员变量和虚函数。

判断对象是否在堆上可以通过:
1)连续生成两个对象,如果第二个对象的地址大于第一个对象,即对象是在heap上。

简单的测试代码:

#include <iostream>
using namespace std;class del_this{
public:static int int_is_heap;int val;int get_val(){return val;}void do_something(){cout<<"do something"<<endl;}void destroy() const{//如果要使用delete this 这条语句,必须保证对象是位于heap上的,即必须是new 一个对象delete this;}del_this():val(0){}
private:~del_this(){}};
//typedef void (del_this::*p)();//这是一个类型int main(int argc, const char * argv[]) {del_this *p_del_this=new del_this;del_this *p_del_this2=new del_this;//    del_this d;
//    d.destroy();//在运行中直接报错cout<<"address_first_object: "<<p_del_this<<endl;cout<<"address_second_object: "<<p_del_this2<<endl;//address_first_object: 0x100500330//address_second_object: 0x100500340//可以看到第二个对象比第一个对象大,即new的对象都在堆上p_del_this->destroy();p_del_this->do_something();}

关于delete this相关推荐

  1. Reject: HTTP ‘DELETE‘ is not allowed, Not injecting HSTS.....DELETE请求PUT请求跨域问题

    CORS(DELETE请求.PUT请求) Reject: HTTP 'DELETE' is not allowed [DEBUG] 2021-08-25 15:23:52.401 [http-nio- ...

  2. Git 常用操作(6)- 推送到远程仓库(git push)删除远程分支(git push origin --delete)

    1. git remote add--添加远程仓库 在GitHub 上创建的仓库路径为 "git@github.com:用户名/git-tutorial.git".现在我们用git ...

  3. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  4. C++:随笔6---new\delete\虚方法\抽象方法

    指针是一种专门用来存储内存地址的数据类型.(他存储的不是具体的数据而是别人的地址) 常用做法是:创建一个变量,再把这个变量的地址赋值给一个指针,然后就可以用指针去访问这个变量的值. 事实上在C和C++ ...

  5. C++中的new和delete用法

    //个体 point *p=new point; //point类存在初始化成员函数point(void)的前提下才能这样赋值: delete p;//一维数组,这样赋值的话,p在程序里表示的就不是指 ...

  6. LeetCode刷题记录3——237. Delete Node in a Linked List(easy)

    LeetCode刷题记录3--237. Delete Node in a Linked List(easy) 目录 LeetCode刷题记录3--237. Delete Node in a Linke ...

  7. 在析构函数中delete this指针问题

    思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢? #include <iostream> using namespace std; class A{ pub ...

  8. LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化

    文章目录 前言 1. 问题背景 2. 问题复现 3. Rocksdb 的 Delete-Aware 优化 3.1 可配置的 Delete-Aware调度 3.2 Compaction 逻辑对 dele ...

  9. leetcode 237: Delete Node in a Linked List

    题目: Write a function to delete a node (except the tail) in a singly linked list, given only access t ...

  10. 【C++】C/C++ 中default/delete特性

    C++类的特殊成员函数及default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https://www.geeksforgeeks.org 目录 目录 C++类的特殊成员函数及def ...

最新文章

  1. Alpha冲刺 - (5/10)
  2. 论述一个模式的时候的方法
  3. 基于 abp vNext 和 .NET Core 开发博客项目 - 自定义仓储之增删改查
  4. sql的的over不能和group by一起使用吧_CellRouter的使用
  5. android基础知识(2)
  6. 2022春季“金三银四”跳槽必备:软件测试面试题(附带答案)
  7. JSP_tomcat_mysql_注冊验证用户;
  8. php按钮打开文件选择框,在Select file(选择)页面单击Select file(选择文件)按钮
  9. java中简单的删除添加修改_教你数据库简单实现添加,显示,修改,删除的方法
  10. 计算机网络实验教程钱德沛_计算机网络实验教程完成版.pdf
  11. 熬了多少个夜晚,大家期待的《网络工程师思科华为华三实战案例红宝书》即网工必备技术命令大全版本1完书...
  12. 计算机四级数据库分值分布,计算机四级数据库工程师考试成绩查询注意事项
  13. 网络相关概念扫盲:公网IP和私网IP 静态IP和动态IP 路由器和交换机和网关
  14. app跳转到指定app
  15. vim 常用指令与设置
  16. 软件架构中的层次依赖
  17. 项目六总结 创建与使用存储过程
  18. Linux启动一个服务后,服务的某个文件所在的目录下出现类似:systemd-private.xxxxxx的目录...
  19. zabbix监控路由器流量
  20. 淘宝历史价格查询php源码,记录历史采购价并在列表中显示最低价

热门文章

  1. YAMAHA机械手的使用注意事项
  2. 网络电视连接服务器显示1404,电信网络电视连接错误代码为1404为什么
  3. 会议安排问题JAVA实现
  4. 【iOS逆向】iOS越狱流程和越狱查看其它APP的UI层级Reveal的使用全流程
  5. HFSS 带状线仿真(HFSS和3D LAYOUT的比较)
  6. Java使用Aria2c进行文件下载
  7. 卡西欧5800计算机隧道程序,卡西欧5800隧道放样程序
  8. PPTP协议详解及报文解析
  9. TA-Lib MA_Type
  10. 网页打开DWG图纸,浏览器直接打开CAD图纸,MxDraw云图平台(H5在线cad) 2022.05.19更新