1、问题1-动态内存分配

2、new malloc区别

3、


Test::Test()
new Test在堆空间申请了一段内存并初始化了一个Test对象(并调用构造函数)
而malloc不会对内存进行初始化,仅仅是申请了一段内存

4、

5、


Test::Test()
~Test::Test()
成功创建 Test对象,调用构造函数
delete 释放pn的内存空间,而内存空间中存放的是对象,会触发对象的析构函数摧毁对象

    Test* pn = new Test;Test* pm = (Test*)malloc(sizeof(Test));free(pn);free(pm);
输出
Test::Test()
因为free只释放pn指向的内存,而内存当中存的是对象,无法调用对象的析构函数摧毁对象,结果会造成内存泄露
#include <iostream>
#include <string>
#include <cstdlib>using namespace std;class Test
{int* mp;
public:Test(){cout << "Test::Test()" << endl;mp = new int(100);cout << *mp << endl;}~Test(){delete mp;cout << "~Test::Test()" << endl;}
};int main()
{Test* pn = new Test;Test* pm = (Test*)malloc(sizeof(Test));delete pn;free(pm);return 0;
}
Test::Test()
100
~Test::Test()

6、delete fiee 区别

7、虚函数问题

8、


构造函数设置成虚函数后,编辑器会报错,不能将构造函数设置为虚函数
虚函数表指针实在构造函数执行后才被正确的初始化,构造函数是一个入口点,如果入口点都没有对象无法初始化

析构函数可以发生多态

8、析构函数未设置成虚函数,影响

#include <iostream>
#include <string>using namespace std;class Base
{
public:Base(){cout << "Base()" << endl;}~Base(){cout << "~Base()" << endl;}
};class Derived : public Base
{
public:Derived(){cout << "Derived()" << endl;}~Derived(){cout << "~Derived()" << endl;}
};int main()
{Base* p = new Derived();// ...delete p;return 0;
}
Base()
Derived()
~Base()发现父类的析构函数位定义为虚函数:
首先父类指针指向一个 new 创建一个子类对象,子类对象在堆空间调用构造函数初始化,先调用父类构造函数,再调用子类初始化。
然后delete p释放堆空间的子类derived对象,首先点调用子类的析构函数,再调用父类的析构函数(期望的情况下是这样的)。
但实际上是只调用了父类的析构函数,而没有调用子类的析构函数,
原因:由于删除的指针类型是父类指针,会直接调用父类的析构函数(因为父类指针未定义成virtual虚函数类型,定义成虚函数后,就会
动态识别当前指针指向的对象类型来调用对应的析构函数,便会先调用子类对象的析构函数,然后调用父类的析构函数,跟多态原理一样)
虚析构函数:确保子类当中的动态分配内存操作在最终得以安全释放。
虚析构函数本质是实现多态

9、


不可以

10、

11、


编译器自己会进行选择

#include <iostream>
#include <string>using namespace std;class Base
{
public:Base(){cout << "Base()" << endl;func();}virtual void func() {cout << "Base::func()" << endl;}virtual ~Base(){func();cout << "~Base()" << endl;}
};class Derived : public Base
{
public:Derived(){cout << "Derived()" << endl;func();}virtual void func(){cout << "Derived::func()" << endl;}~Derived(){func();cout << "~Derived()" << endl;}
};int main()
{Base* p = new Derived();// ...delete p;return 0;
}
构造过程:
Base()
Base::func()
Derived()
Derived::func()析构过程:
Derived::func()
~Derived()
Base::func()
~Base()

12、继承中的强制类型转换

13、

14、

#include <iostream>
#include <string>using namespace std;class Base
{
public:Base(){cout << "Base::Base()" << endl;}virtual ~Base(){cout << "Base::~Base()" << endl;}
};class Derived : public Base
{};int main()
{Base* p = new Base;Derived* pd = dynamic_cast<Derived*>(p);if( pd != NULL ){cout << "pd = " << pd << endl;}else{cout << "Cast error!" << endl;}delete p;return 0;
}
Base::Base()
Cast error!
Base::~Base()而这样就是正确的;Base* p = new Derived;Derived* pd = dynamic_cast<Derived*>(p);
Base::Base()
pd = 0x114ac20
Base::~Base()

15、小结

55-经典问题分析四相关推荐

  1. acm水仙花数java,水仙花数之C语言经典案例分析

    水仙花数之C语言经典案例分析 一.[什么是水仙花数] 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI) ...

  2. 02【简历】重要性,撰写要点,经典案例分析,简历七大模块?

    02[简历]重要性,撰写要点,经典案例分析 简历七大模块:基本信息,教育背景,荣誉奖励,实习经历,项目经历,个人技能,其他(兴趣爱好,自我评价) [Star法则]: STAR法则,即为Situatio ...

  3. Spring 源码分析(四) ——MVC(二)概述

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) from:Spring 源码分析(四) --MVC(二)概述 - 水门-kay的个人页面 - OSCHINA ...

  4. 猴子吃桃c语言程序到第n天,猴子吃桃问题之《C语言经典案例分析》

    猴子吃桃问题之<C语言经典案例分析> 一.[什么是猴子吃桃] 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将第一天剩下的桃子吃掉一半,有多吃了 ...

  5. 手机自动化测试:Appium源码分析之跟踪代码分析四 1

    手机自动化测试:Appium源码分析之跟踪代码分析四 控制器模块 // Appium webserver controller methods // https://github.com/hugs/a ...

  6. matlab图形绘制经典案例,MATLAB经典教程第四章_图形绘制.ppt

    <MATLAB经典教程第四章_图形绘制.ppt>由会员分享,可在线阅读,更多相关<MATLAB经典教程第四章_图形绘制.ppt(32页珍藏版)>请在人人文库网上搜索. 1.Ma ...

  7. ArcGIS网络分析之Silverlight客户端最近设施点分析(四)

    ArcGIS网络分析之Silverlight客户端最近设施点分析(四) 原文:ArcGIS网络分析之Silverlight客户端最近设施点分析(四) 在上一篇中说了如何实现最近路径分析,本篇将讨论如何 ...

  8. mysql的高阶用法_MySQL的经典用法(十四)-高级优化

    mysql的经典用法(十四)----高级优化 基于 /application/search/mysql/mysql-5.5.28/support-files/my-innodb-heavy-4G.cn ...

  9. ABP源码分析四十七:ABP中的异常处理

    ABP源码分析四十七:ABP中的异常处理 参考文章: (1)ABP源码分析四十七:ABP中的异常处理 (2)https://www.cnblogs.com/1zhk/p/5538983.html (3 ...

  10. 【投屏】Scrcpy源码分析四(最终章 - Server篇)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

最新文章

  1. 索赔cs1.6最新服务器,成功解决CS1.6刷不出服务器
  2. 搭建turnserver
  3. Android中通过Java代码实现ScrollView滚动视图-以歌词滚动为例
  4. 前端如何实现:在不刷新页面的情况下实时看到自己的评论
  5. 用HttpURLConnection发送http请求
  6. 用 65 行代码实现 JavaScript 动画序列播放
  7. pythonmt4通讯swot矩阵_最经典的市场部SWOT分析矩阵
  8. 年轻导演的创业之路-杨立坤
  9. crt软件(crt软件安装)
  10. PLSQL Developer多 表 查 询
  11. Excel文件加密后忘记密码 - 破解方法
  12. 鱼塘钓鱼(fishing)
  13. 制造工厂中的计件工资管理
  14. 2018携程校招笔试第二道编程题
  15. 北京最最最牛的IT公司都在这了 。。。
  16. Mbps 和MB/s 之间的区别
  17. Podium Vue客户端组件库
  18. [ARM]GIC相关知识
  19. AIRPLAY镜像音频数据的处理
  20. Go 语言开发工具 LiteIDE X36 发布

热门文章

  1. 【已解决】python 使用xlrd,xlwt 修改execl单元格的背景色
  2. SOLIDWORKS中钣金展开标注是英文怎么办?
  3. 利用Tensorflow构建RNN并对序列数据进行建模
  4. 奥塔哥大学计算机科学怎样,奥塔哥大学自然科学学院挂科率高吗?
  5. 顶级域名.tk申请与DNSPOD解析
  6. php创蓝253四要素认证_创蓝253配置
  7. 【UV打印机】理光喷头组合说明(24H)
  8. 《战神3》GDC技术制作团队研讨报导
  9. 关于keil-C51中code、idata以及xdata
  10. 基于字的二元模型拼音输入