C++ delete仍可访问的问题
C++ delete和置为NULL
先上一段代码:
class Object
{
public:
explicit Object(int num) : m_num(num){}
void function1()
{
std::cout << "function1()" << std::endl;
}
void function2()
{
std::cout << "function2(): " << m_num << std::endl;
}
private:
int m_num;
};
简单的定义了一个名为Object的类,然后测试一下
int main()
{
Object *obj = new Object(10);
delete obj;
obj->function1();
return 0;
}
编译运行一下:obj->function1()居然可以正常运行。已经执行delete掉了,为什么还能运行呢?再测试一下obj->function2()看看
int main()
{
Object *obj = new Object(10);
delete obj;
obj->function2();
return 0;
}
编译运行一下:发现obj->function2()也可以运行,但是运行的信息貌似不对,打印出来的m_num值不对哇。
再测试一下:
int main()
{
Object *obj = new Object(10);
delete obj;
obj = nullptr;
obj->function1();
obj->function2();
return 0;
}
编译运行一下:发现obj->function1()可以运行,obj->function2()运行出现异常。这3个简单的测试说明了一个什么问题呢?
其实很简单,首先obj->function1()没有使用到类的实例的内存,实例被释放对它来说是无所谓的,压根不会影响它的运行。
再看obj->function2()这个函数,它使用到了类实例中的m_num, 也就是说它使用了类实例的内存,delete只是将类实例的内存所有权归还给了系统,并不是清空了这块内存,内存是客观存在的,它是可以访问的。因此obj->function2()还是可以运行的,但是类实例已经放弃了这块内存的所有权,obj->function2()再去读这块内存会读到什么是不确定的。执行obj = nullptr后,再运行obj->function2()没有内存去访问,因此会报错。
不管如何,delete一个类的实例后,都不应该再去访问类的成员函数,不论它是否能正常运行正常,它都危险的。
delete一个类的实例后,置位NULL,可以在一定程度上避免危险的发生。
同时需要注意的一点是new和delete相当于借和还,并不是简单的创建和销毁。
C++ delete仍可访问的问题的更多相关文章
- Centos给文件设置了777权限仍不能访问解决方案
Centos给文件设置了777权限仍不能访问: 开启了SELinux导致 1.查看SELinux状态:/usr/sbin/sestatus -v ##如果SELinux status参数为enable ...
- webpack构建项目连接本机IP仍无法访问问题
通过连接IP地址,确定连接成功后仍无法访问本机运行项目,需要对项目配置进行修改,有两种情况: 第一种是在config/index.js,把module.exports={}中找到 host:'loca ...
- pg中删除的页是否仍被访问
昨天看到微信群中,有人提问:pg对于标记为删除的页,是否会扫描到? 今天做了一下测试,发现如果删除的是表的最后连续的几个页(根据ctid来确定数据插入先后,只讨论有insert的情况)中的数据,最后几 ...
- 关于Centos7 firewalld防火墙开放端口后仍不能访问ftp和nginx的问题解决
我在阿里轻量应用服务器搭建ftp服务器这篇博客中把防火墙换为iptables,因为当时无论我怎么设置firewalld,就是无法访问ftp服务器,今天在翻看其他博客的时候,突然发现firewalld有 ...
- 阿里云服务器redis启动绑定ip 开放端口仍无法访问问题
今天使用云服务器其redis 始终无法访问.redis.conf 这个配置文件也是改了又改.最后发现 执行redis启动命令时没有带上配置文件.仍然使用默认配置. src/redis-server ...
- 动态对象创建(二)重载new和delete
动态对象创建(二)重载new和delete 前言 上文我简单介绍了一下动态对象创建的方法,这一篇文章的内容主要是对重载new和delete做一些讲解,也希望能够得到博友们的指点,在这里谢过大家. 通常 ...
- 修改nginx的访问目录以及遇到的403错误修改总结
对于这个问题困扰了我好几天,前篇文章介绍了图片服务器的使用,但是两个服务器如何进行通话访问呢,即如何通过nginx来访问ftp服务器上的资源文件呢,这里面需要修改nginx的配置文件(vi /usr/ ...
- 局部内部类访问方法中的局部变量为什么加final
转载:http://www.cnblogs.com/mjblogs/p/4971630.html 1)从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形 ...
- Android(java)学习笔记150:为什么局部内部类只能访问外部类中的 final型的常量
为什么匿名内部类参数必须为final类型: 1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变 ...
随机推荐
- Shell中Bash的基本功能(二)
1 历史命令 1)历史命令的查看[root@localhost ~]# history [选项] [历史命令保存文件]选项:-c: 清空历史命令-w: 把缓存中的历史命令写入历史命令保存文件.如果不手 ...
- HDU 6191 Query on A Tree(字典树+离线)
Query on A Tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Othe ...
- [THUSC2017]大魔法师:线段树
分析 在线段树上用\(4 \times 4\)的矩阵打标记. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(register int ...
- android自定义camera以及uri和文件路径之间的转换
相对直接调用系统的camera,这种方法使用得相对还少一些.根据api文档,步骤如下: 定义一个预览类 可以参照<android高薪之路>这本书上面,有这种方法的一种完整实现 而对应的ac ...
- python正则之模式re.I re.M
re.I 忽略大小写 >>> re.match(r"A","abc",re.I) <_sre.SRE_Match object at 0 ...
- AVLTree的实现以及左右旋转维持自平衡
AVL(Adelson-Velskii and Landis)树是带有平衡条件的二叉查找树.这个平衡条件必须要容易保持,而且它保证树的深度须是o(logN).最简单的想法是要求左右子树具有相同的高度, ...
- 2018-2019-2 网络对抗技术 20165235 Exp 9 Web安全基础
实验任务 本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分.包括(SQL,XSS,CSRF).Webgoat实践下相关实验. 基础问题回答 (1)SQL注入攻击原理,如何防御 ...
- SQL Server阻塞blocking案例分析
今天在性能测试过程中发现大量阻塞报警,检查whoisactive(https://github.com/amachanic/sp_whoisactive/)数据发现,阻塞blocking头部sessi ...
- mysql命令使用3
算术运算函数 sum()求和 mysql> select sum(price) from books;+------------+| sum(price) |+------------+| 10 ...
- 服务器端-W3Chool:服务器脚本教程
ylbtech-服务器端-W3Chool:服务器脚本教程 1.返回顶部 1. 服务器脚本教程 从左侧的菜单选择你需要的教程! SQL SQL 是用于访问和处理数据库的标准的计算机语言. 在本教程中,您 ...