动态多态中存在的问题:可能会产生内存泄漏!

以下通过一个例子向大家说明问什么会产生内存泄漏:

 class Shape//形状类
{
public:
Shape();
virtual double calcArea();
};
class circle:public Shape//圆类
{
public:
circle(int x,int y,double r);//构造函数
~circle();
virtual double calcArea();
private:
double m_dR;
Coordinate *m_pCenter;//圆心坐标
};
circle::circle(int x,int y,double r)
{
m_pCenter=new Coordinate(x,y);
m_dR=r;
}
circle::~circle()
{
delete m_pCenter;
m_pCenter=NULL;
}
 int main(void)
{
Shape *shape1=new circle(4.0);
shape1->calcArea();
delete shape1;
shape1=NULL;
return ;
}
delete shape1;
shape1=NULL;
当delete后面跟的是父类的指针,只会执行父类的析构函数,
当delete后面跟的是子类的指针,则父类和子类的析构函数都会被执行。
delete shape1;这个时候是想通过父类指针销毁子类对象,将不会执行子类的析构函数,所以会产生内存泄漏。

这种情况怎么解决呢?

我们使用virtual关键字来修饰析构函数。
写法:

这个时候我们再delete父类指针,首先就会执行父类指针指向的子类对象相应的析构函数。

析构函数的使用限制:

1.普通函数不能是析构函数。

2.静态成员函数不能是虚函数。

3.内联函数不能是虚函数。

4.构造函数不能为虚函数。

												

C++学习笔记:多态篇之虚析构函数的更多相关文章

  1. PHP学习笔记 - 进阶篇(3)

    PHP学习笔记 - 进阶篇(3) 类与面向对象 1.类和对象 类是面向对象程序设计的基本概念,通俗的理解类就是对现实中某一个种类的东西的抽象, 比如汽车可以抽象为一个类,汽车拥有名字.轮胎.速度.重量 ...

  2. PHP学习笔记 - 入门篇(5)

    PHP学习笔记 - 入门篇(5) 语言结构语句 顺序结构 eg: <?php $shoesPrice = 49; //鞋子单价 $shoesNum = 1; //鞋子数量 $shoesMoney ...

  3. PHP学习笔记 - 进阶篇(11)

    PHP学习笔记 - 进阶篇(11) 数据库操作 PHP支持哪些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Syba ...

  4. PHP学习笔记 - 进阶篇(10)

    PHP学习笔记 - 进阶篇(10) 异常处理 抛出一个异常 从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被 ...

  5. PHP学习笔记 - 进阶篇(9)

    PHP学习笔记 - 进阶篇(9) 图形图像操作 GD库简介 GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新 ...

  6. PHP学习笔记 - 进阶篇(8)

    PHP学习笔记 - 进阶篇(8) 日期与时间 取得当前的Unix时间戳 UNIX 时间戳(英文叫做:timestamp)是 PHP 中关于时间与日期的一个很重要的概念,它表示从 1970年1月1日 0 ...

  7. PHP学习笔记 - 进阶篇(7)

    PHP学习笔记 - 进阶篇(7) 文件操作 读取文件内容 PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中. $conte ...

  8. PHP学习笔记 - 进阶篇(6)

    PHP学习笔记- 进阶篇(6) 会话控制(session与cookie) 当前的Cookie为: cookie简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据. ...

  9. PHP学习笔记 - 进阶篇(4)

    PHP学习笔记 - 进阶篇(4) 字符串操作 字符串介绍 PHP开发中,我们遇到最多的可能就是字符串. 字符串变量用于包含字符串的值. 一个字符串 通过下面的3种方法来定义: 1.单引号 2.双引号 ...

随机推荐

  1. 【awk】用awk将Fasta文件序列变成一行

    awk: awk '/^>/&&NR>1{print "";}{ printf "%s",/^>/ ? $0" &q ...

  2. 如何在Qt中使用自定义数据类型

    这里我们使用下面这个struct来做说明(这里不管是struct还是class都一样): struct Player { int number; QString firstName; QString ...

  3. 58 字体反爬攻略 python3

    1.下载安装包 pip install fontTools 2.下载查看工具FontCreator 百度后一路傻瓜式安装即可 3.反爬虫机制 网页上看见的 后台源代码里面的 从上面可以看出,生这个字变 ...

  4. k8s构建镜像-基于centos的python环境+pip

    FROM centos:7.4.1708 #维护者信息MAINTAINER by icdss # 标签LABEL version="1.0" # 安装依赖RUN yum -y up ...

  5. Spring中三种编程式事务的使用

    引入事务管理器 @Autowired TransactionTemplate transactionTemplate; @Autowired PlatformTransactionManager tr ...

  6. [CTF] RSA共模攻击

    from gmpy2 import * import libnum n = 0x00b0bee5e3e9e5a7e8d00b493355c618fc8c7d7d03b82e409951c182f398 ...

  7. 单体 VS 微服务

    看图说话 群里发来一张图, 形象TM又生动: 异同之处 借此对比说说单体和微服务的异同之处: 一大坨的时候, 难泄, 具体表现为, 牵一发而动全身, 时而久之, 便秘/肠道不适/影响代谢/肤色变差/身 ...

  8. jQuery的offset、position、scroll,元素尺寸、对象过滤、查找、文档处理

    jQuery_offset和position var offset = $('.xxx').offset() console.log(offset.left.,offset.top)xxx相对于页面左 ...

  9. ng/cli uses yarn as the package manager

    Switch to working directory Excuting the following command ng config cli.packageManager yarn

  10. HackerRank-Python攻城歷程-2.List comprehensions

    if __name__ == '__main__': x = int(input()) y = int(input()) z = int(input()) n = int(input()) print ...