博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象自杀 delete this
阅读量:5037 次
发布时间:2019-06-12

本文共 856 字,大约阅读时间需要 2 分钟。

In order to understand "delete this" :

First Step------dive into "delete p"

delete p 执行了哪两个步骤?

delete p 是一个两步的过程:调用析构函数,然后释放内存。delete p产生的代码看上去是这样的(假设是Fred*类型的):

// 原始码:delete p;

if (p != NULL) 
{
   p->~Fred();
   operator delete(p);
}

p->~Fred() 语句调用 p 指向的Fred 对象的析构函数。

operator delete(p) 语句调用内存释放原语 void operator delete(void* p)。

Second Step-------"delete this"

 

作为一种“禁术”,使用的时候必须要相当小心才行,《C++ FAQ》里提到所谓“小心”至少包括以下几个方面:

1、this对象是必须是用 new操作符分配的(而不是用new[],也不是用placement new,也不是局部对象,也不是global对象);

2、delete this后,不能访问该对象任何的成员变量及虚函数(delete this回收的是数据,这包括对象的数据成员以及vtable,不包括函数代码);

3、delete this后,不能再访问this指针。换句话说,你不能去检查它、将它和其他指针比较、和 NULL比较、打印它、转换它,以及其它的任何事情;

限制只在堆上分配对象

 

  1. 析构函数私有化(如果有子类,则protected化,保证子类能够正确继承)--以保证对象必须使用new在堆上分配内存;

  2. 提供(可以在仅仅在基类中)Destroy(void)函数,里面仅有一句delete this--以保证第三方能够将分配的内存回收;

转载于:https://www.cnblogs.com/eagleking0318/archive/2011/10/27/6521188.html

你可能感兴趣的文章
IO流之File类
查看>>
sql 基础语句
查看>>
CF717A Festival Organization(第一类斯特林数,斐波那契数列)
查看>>
控件发布:div2dropdownlist(div模拟dropdownlist控件)
查看>>
Oracle composite index column ordering
查看>>
kaggle竞赛
查看>>
区块链入门教程
查看>>
npm常用命令
查看>>
南海区行政审批管理系统接口规范v0.3(规划)4.2.【queryExpireList】当天到期业务查询...
查看>>
[置顶] 细说Cookies
查看>>
[wp7软件]wp7~~新闻资讯,阅读软件下载大全! 集合贴~~~
查看>>
生成指定位数随机数的方法
查看>>
Essential C++学习笔记
查看>>
where,having与 group by连用的区别
查看>>
【MySQL】MySQL锁和隔离级别浅析二 之 INSERT
查看>>
Oracle T4-2 使用ILOM CLI升级Firmware
查看>>
4.14上午
查看>>
数据分析 -- 白话一下什么是决策树模型(转载)
查看>>
Java SPI机制原理和使用场景
查看>>
web前端java script学习2017.7.18
查看>>