首页 > 编程语言 >《Effective C++》读书笔记

《Effective C++》读书笔记

时间:2024-04-21 13:55:20浏览次数:26  
标签:函数 Effective 读书笔记 C++ 析构 基类

《Effective C++》读书笔记

之前看过一遍,不过草草了事。近日看了《深度探索C++对象模型》,想起《Effective C++》中的内容已经有些忘记了,所以重新温习一下。这篇笔记只挑选书中的一些重要内容进行记录。

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

这一个条款几乎是面试中的高频问题,只需要回答,如果不将基类中的析构函数声明为虚函数,那么当我们通过基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,这样就会导致派生类中的资源无法释放,即“局部销毁”,造成内存泄漏。可是,为什么会这样呢?以及为什么将析构函数声明为虚函数就可以解决这个问题呢?

让我们结合《深度探索C++对象模型》中的内容来解释这个问题。-我们知道C++通过虚拟机制实现多态,而在表现上,多态就是“以一个public base class的指针或者引用寻指出一个derived class object”的意思,因此通过基类指针

下面是示例代码:

#include <cstdlib>
#include <iostream>

class Base {
 public:
  Base() {
    _base_data = static_cast<char*>(malloc(100));
    std::cout << "Base constructor" << std::endl;
  }
  virtual ~Base() {
    free(_base_data);
    _base_data = nullptr;
    std::cout << "Base destructor" << std::endl;
  }

 private:
  char* _base_data;
};

class Derived : public Base {
 public:
  Derived() {
    _derived_data = static_cast<char*>(malloc(100));
    std::cout << "Derived constructor" << std::endl;
  }
  virtual ~Derived() override {
    free(_derived_data);
    _derived_data = nullptr;
    std::cout << "Derived destructor" << std::endl;
  }

 private:
  char* _derived_data;
};

int main() {
  Base* base{new Derived()};
  delete base;
  return 0;
}

标签:函数,Effective,读书笔记,C++,析构,基类
From: https://www.cnblogs.com/tianshihao/p/18148854

相关文章

  • 深度解读《深度探索C++对象模型》之数据成员的存取效率分析(二)
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表。接下来的几篇将会讲解非静态数据成员的存取分析,讲解静态数据成员的情况请见上一篇:《深度解读《深度探索C++对象模型》之数据成员的存取......
  • C++ STL -- HashTable
    HashTable一般常用的unordered_set、unordered_map都是基于哈希表实现的,哈希表主要需要注意的是哈希冲突,迭代器等基础哈希映射使用哈希函数将键映射到索引的数据结构。即将原始数组索引通过哈希函数映射到一个哈希值上,从而将一个大范围索引,减小到一个小的固定范围哈希冲突......
  • FreeLearning C/C++ 译文集翻译完成
    C++高级编程C++高级编程秘籍QtCreator应用开发C++游戏编程入门指南C++编程入门指南Boost.AsioC++网络编程BoostC++应用开发秘籍第二版C++数据结构与算法设计原理C++Qt5GUI编程C++高性能编程C++反应式编程C++系统编程秘籍C++研讨会C++现代嵌入式......
  • js,php,C++ 压缩算法不一致
    参考:https://yushuangqi.com/blog/2015/golang-php-gzencode-difrent.html压缩的数据:这是要压缩的数据aaaaaaaaaaaaaaaaaaa2222222222222222222222222222222顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶fffffffffffffffffffgggggggggggggggggggeeeeeeeeeeeeee对应的三种语言的最后数......
  • 深度解读《深度探索C++对象模型》之数据成员的存取效率分析(一)
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表。在《深度解读《深度探索C++对象模型》之C++对象的内存布局》这篇文章中已经详细分析过C++的对象在经过封装后,在各种情况下的内存布局以......
  • C++ STL -- list
    listlist是一种基于双向链表的数据结构,适用于需要在序列中执行频繁插入和删除操作的场景特性本质上是一个双向链表,允许在序列的两端和中间执行插入和删除操作只能通过迭代器访问元素,即访问元素的时间复杂度为\(O(n)\)动态内存管理,内部通过类似指针的节点实现元素存储,一个节......
  • C++ int main(int argc, char *argv[])的参数
    一般来说intmain有两种写法 第一种就是不带参数的intmain(){return-1;} 第二种就是带有参数的intmain(intargc,char*argv[]){return-1;}这里argc是参数的个数,实际调用函数时不用手动传入,其是根据*argv参数列表内的个数进行统计实际传入的参数都存入*a......
  • GDExtension的C++示例
    GDExtension的C++示例本文按照官方文档,进行c++的GDExtension​插件开发,主要进行文档进行复刻,同时对文档中未涉及步骤进行补充什么是GDExtension除了GDScript​和C#​这两种脚本语言外,Godot​引擎可以执行其他编程语言编写的代码。目前有两种方式实现:C++模块与GDExtension简单......
  • C++字符串常见混淆方案
    正文将字符串转换成等效int数组std::vector<uint32_t>convert_wstring_to_int_array(constwchar_t*str){std::vector<uint32_t>vec;for(size_ti=0;i<wcslen(str);i+=2){uint32_tval=(uint32_t)str[i]<<16&0xffff0000;i......
  • 为什么有很多出名开源的C/C++方面的高性能网络库,比如libevent,boost-asio,有些企业还要
    为什么有很多出名开源的C/C++方面的高性能网络库,比如libevent,boost-asio,有些企业还要自己写?    我个人很倾向用著名的开源软件来完成功能需求,但是发现在实际开展中很多人会反对开源,而要求自己实现一套,我不知道是我考虑太少,还是他们太武断。 因为KPI的原因更多......