当前位置: 首页 > news >正文

深圳市住建局网站官网济南网站建设公司哪家好

深圳市住建局网站官网,济南网站建设公司哪家好,淘宝天猫做网站咨询,厦门网站建设案例Effective C 条款07:为多态基类声明virtual析构函数核心思想:当通过基类指针删除派生类对象时,如果基类没有虚析构函数,会导致派生类资源泄漏。因为此时只会调用基类的析构函数,而不会调用派生类的析构函数。 ⚠️ 1. …

Effective C++ 条款07:为多态基类声明virtual析构函数


核心思想当通过基类指针删除派生类对象时,如果基类没有虚析构函数,会导致派生类资源泄漏。因为此时只会调用基类的析构函数,而不会调用派生类的析构函数。

⚠️ 1. 问题场景:非虚析构函数导致资源泄漏
class Base {
public:Base() { std::cout << "Base构造\n"; }~Base() { std::cout << "Base析构\n"; } // 非虚析构函数
};class Derived : public Base {
public:Derived() : data(new int(42)) { std::cout << "Derived构造\n"; }~Derived() { delete data; // 释放资源std::cout << "Derived析构\n"; }
private:int* data; // 派生类独占资源
};int main() {Base* pb = new Derived(); // 基类指针指向派生类对象delete pb; // 仅调用Base::~Base() → 内存泄漏!
}

输出结果

Base构造
Derived构造
Base析构

问题Derived的资源data未被释放 → 内存泄漏!


2. 解决方案:声明虚析构函数
class Base {
public:Base() { std::cout << "Base构造\n"; }virtual ~Base() { std::cout << "Base析构\n"; } // 虚析构函数
};class Derived : public Base { /* 实现同上 */ };int main() {Base* pb = new Derived();delete pb; // 正确调用派生类析构函数
}

输出结果

Base构造
Derived构造
Derived析构  // 先调用派生类析构函数
Base析构    // 再调用基类析构函数

🔍 3. 关键原则
场景析构函数要求原因
多态基类(有虚函数)必须virtual确保通过基类指针删除派生类对象时,正确调用派生类析构函数
非多态基类(无虚函数)不应virtual避免虚表指针带来的空间开销(条款7指出每个对象增加4-8字节)
STL容器(如std::string禁止继承标准库类的析构函数均为非虚,通过基类指针删除派生类对象会导致未定义行为

⚠️ 4. 错误实践:继承STL容器类
class MyString : public std::string { 
public:~MyString() { std::cout << "MyString析构\n"; }
};int main() {std::string* ps = new MyString(); delete ps; // 未定义行为!std::~string非虚
}

结果MyString::~MyString()不会被调用 → 潜在资源泄漏!


💎 5. 纯虚析构函数的特殊用法

使类成为抽象类,同时仍需要提供实现

class AbstractBase {
public:virtual ~AbstractBase() = 0; // 纯虚声明
};
AbstractBase::~AbstractBase() {}  // 必须提供实现class Concrete : public AbstractBase {
public:~Concrete() override { std::cout << "Concrete析构\n"; }
};int main() {AbstractBase* p = new Concrete();delete p; // 正确调用链:Concrete::~ → AbstractBase::~ 
}

总结:多态基类虚析构三原则

  1. 多态基类必须声明虚析构函数
    virtual ~Base() = default;
  2. 非多态基类不要声明虚析构函数
    避免无谓的虚函数表开销
  3. 禁止继承无虚析构函数的类(如STL容器)
    组合优于继承:将目标类作为成员变量而非基类
http://www.dtcms.com/a/550162.html

相关文章:

  • Kubernetes资源管理全解析
  • 郑州企业型网站建设怎么做可以访问网站
  • 网站制作前必须做的事情有哪些网站行业
  • TC3xx芯片ACCEN寄存器保护详解
  • Linux上如何挂载磁盘
  • 卫星轨道计算中的数值精度陷阱:第三体引力摄动的稳定性优化
  • 白山网站seoe网站的图标怎么做
  • RHSCA---用户和组管理
  • 温州网站域名注册服务公司易语言如何做浏网站
  • 仿糗事百科网站源码dede二次开发分享+评论+互动国外网站域名
  • 仓颉语言中String的内存表示深度解析
  • NetSuite 中自定义基础打印模板的调整方法分享
  • 东城企业网站开发什么网站能免费做简历
  • “调用销毁者置于末尾”原则
  • GRPO相关优化论文
  • Openvins学习---ov_msckf中的State.h
  • 有什么网站可以做数学题项目建设全过程
  • 德庆网站建设良精企业网站管理系统
  • dz网站自己做的模板放在哪里小说网站建设的支柱
  • idea中Docker一键自动化部署
  • faster-whisper热词详解与程序设计
  • 电子电力技术的控制电路学习分享1
  • 原生JS实现虚拟列表:从基础到性能优化的完整实践
  • 万全网站建设Myeclipse怎么做网站
  • C#: Contains 方法
  • .NET 泛型编程(泛型类、泛型方法、泛型接口、泛型委托、泛型约束)
  • 网站建设研究方法建筑图纸字母代表大全图解
  • PocketBase轻量级后端解决方案
  • 【JavaWeb|day19 Web后端进阶 SpringAOP、SpringBoot原理、自定义Starter、Maven高级】
  • 织梦可以放两个网站网站内容架构