ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

为什么c++11的标准中对于class要加入final?

2022-07-06 09:01:51  阅读:167  来源: 互联网

标签:11 int Derived c++ Base 内存 析构 new final


Effective C++ 中,条款 07 提到:“如果你曾经企图继承一个标准容器或任何其他“带有 non-virtual 析构函数”的 class,拒绝诱惑吧!”。

直接来看代码,再作出解释:

struct Base {
  ~Base() {}
};

struct Derived : public Base {
  int *x;
  Derived(int *_x) : x(x) {}
  ~Derived() {
    delete x;
  }
};

上诉代码,定义了基类 Base 和派生类 Derived 。 然而,如果我们执行如下的代码,就会发生内存泄漏的错误。

int *x = new int;
Derived *d = new Derived(x);
Base *pb = d;
delete pb; 

Derived* 转换为 Base*,然后删除 Base*。 删除操作将会调用 Base 的析构函数,而不是 Derived 的析构函数,这将导致 Derived 的成员变量 x 的内存不会释放,导致内存泄漏。

因此,如果在 Base 中加入 final 关键字,就可以防止“不应该”的继承发生。

标签:11,int,Derived,c++,Base,内存,析构,new,final
来源: https://www.cnblogs.com/Bibo000001/p/16449378.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有