写出下面程序的运行结果:

class Test{

public:

Test(){i=10;

delete this;}

int i;

};

int main(){

Test *test=new Test();

cout<<test->i<<endl;

}

  • main函数中声明一个Test类的对象指针并用new构造一个对象,然后输出对象成员。这里面比较特殊的是Test类的构造函数,因为在构造函数中使用了delete操作符释放了对象自身的空间,并引发了析构函数的调用,相当于对象在构造时把自己释放掉了。
  • 基于上述分析,可能会得出如下结论:程序本身语法没有错误,但是由于在构造函数时使用了delete this,相当于调用了析构函数,对象被销毁,之后访问对象的数据成员会产生运行错误。
  • 这种解释听起来似乎很有道理,但是运行后发现,程序不但编译通过,而且运行时运行时竟然也没有报错,产生了输出结果,只是输出结果并不是10,而是一个看起来随机的值,并且每次运行的输出结果都不尽相同。
  • 原因是,在执行delete this后,指针test成为一个野指针。由于野指针test之下宁的是一个有效的地址,因此在访问数据成员i时,依然会依照Test类的对象模型访问响应的空间,并输出这个空间中的内容,因此输出结果是随机的。

在构造函数中释放对象本身相关推荐

  1. JavaScript中的对象,如何创建对象,创建对象的7种模式

    ECMA-262把对象定义为:"无需属性的集合,其属性可以包含基本值.对象或者函数."严格来讲,这就相当于说明对象是一组没有特定顺序的值.对象的每个属性或方法都有一个名字,而每个名 ...

  2. C++中堆对象的构造函数和析构函数逆向分析

    实验环境: 操作系统:Windows XP Professional Service Pack 3 集成开发环境:Microsoft Visual C++ 6.0 构建版本:Debug版本 实验代码: ...

  3. 深入理解Javascript中构造函数和原型对象的区别

    在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor) ...

  4. C++对象模型4——多重继承的对象内存模型、vptr与vtbl的创建与重置的时机、不要在含有虚函数的类的构造函数中调用memset

    一.多重继承的对象内存模型 class Base1 { public:virtual void f() {cout << "base1::f()" << e ...

  5. C++经典问题:如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B?

    对象成员特点总结: (1)实例化对象A时,如果对象A有对象成员B,那么先执行对象B的构造函数,再执行A的构造函数. (2)如果对象A中有对象成员B,那么销毁对象A时,先执行对象A的析构函数,再执行B的 ...

  6. js中的对象、原型链机制、构造函数

    一.在js中创建对象的方式 //一.字面量或直接量创建对象var obj1 = {name:"zs",age:12}; //二.通过new来创建对象var obj2 = new O ...

  7. java 默认参数 实例化_如何使用Kotlin中的默认构造函数参数值实例化对象?

    使用在科特林: 在构造函数中的默认值仅服用时该构造的特定参数不传递到它在所有.那意味着它是为了实现各种组合的参数化构造函数. 例如, data class Bird (val name: String ...

  8. 27.能否在构造函数中抛出异常?析构函数呢?

    首先,我们要明确一点!一个函数执行的过程中,如果抛出异常,会导致函数提前终止! 在C++构造函数中,既需要分配内存,又需要抛出异常时要特别注意防止内存泄露的情况发生.因为在构造函数中抛出异常,在概念上 ...

  9. 从一般到特殊-C#中的对象

    文章目录 对象的概念 对象的创建和使用 匿名类型和初始化器 构造函数和析构函数 构造函数 析构函数 范例 参数传递 博主写作不容易,孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 对象的概念 类是 ...

  10. 在构造函数中使用new时应注意的事项

    在构造函数中使用new时应注意的事项 使用new初始化对象的指针成员时必须特别小心. ● 如果在构造函数中使用new来初始化指针成员,则应该在析构函数中使用delete. ● new和delete必须 ...

最新文章

  1. 7_2判断两个单链表是否相交,若相交,求出第一个交点
  2. 意念实时转语音!Facebook的非植入式脑机接口,解码准确率达到76%
  3. React+webpack热更新配置
  4. 点击延迟_300ms 延迟是什么,如何解决
  5. 数据分析师+做过名企项目+懂运营+985毕业=跳槽失败?
  6. 关于C/C++中函数参数传递的规则
  7. Spring事务管理知识概述
  8. php size(),PHP filesize() 函数
  9. python函数文档说明调用方式_Python函数参数调用
  10. jQuery学习笔记--JqGrid相关操作 方法列表(上)
  11. fprintf fscanf等函数的用法
  12. python发送文件到指定的邮箱_python笔记:批量将指定附件发送到指定邮箱地址
  13. Ubuntu安装虚拟机
  14. Python字符串对齐方法(ljust()、rjust()和center())详解
  15. VMW15虚拟机安装macOS
  16. ATH9K Driver Learning Part III: Data packet transmission
  17. API 网关与反向代理
  18. 2018.9-江苏电赛省赛-基于STM32F103RCT6和FDC2214的手势识别装置
  19. Python 正则表达式里的单行s和多行m模式
  20. MATLAB Signal Rrocessing(8)滤波器分类

热门文章

  1. App.config配置详解
  2. Apache JMeter 5.1.1 发布,压力测试工具
  3. nginx + lua 构建网站防护waf(一)
  4. JDBC常用API和使用
  5. hadoop namenode启动不了_hadoop全分布式是个什么鬼?!动手搭建Hadoop(4)
  6. 讲python现状的文章_用 Python 分析 Python 工作现状
  7. python列表元组字典集合实验心得_python心得 元组,字典,集合
  8. ispalpha函数与islower
  9. BNU 背包密码(编码与解密)
  10. hashmap 存取原理图_HashMap原理(二) 扩容机制及存取原理