C++中容易被忽略的基础知识

2020-06-12  本文已影响0人  潘雪雯

const和define的区别
C++中static关键字的总结
C++中的构造函数及深拷贝浅拷贝
c++基础之引用和指针的学习和区别
c++中的new和delete
C++中多态
c++智能指针用法
c++中的字符串string和C语言中的字符char
C++中的构造函数
c++中的内联函数
c++中struct和class关键字区别
C++中重写、重载、重定义

要回收一个对象申请的资源,就需要调用析构函数。有时虽然没有显式的调用析构函数,但是编译器都会默认地为我们执行析构函数。
当执行BaseClass *base = new BaseClass();。执行delete base时,会调用析构函数为我们释放资源。
而执行**BaseClass *sub = new SubClass(); **。如果BaseClass基类的析构函数不是虚函数时,delete sub对象时,只会释放BaseClass基类申请的资源,而不是释放SubClass派生类的资源。原因如下:
基类指针指向派生类对象,而基类中的析构函数是非virtual的,而虚构函数是动态绑定的基础。现在析构函数不是virtual的,因此不会发生动态绑定,而是静态绑定,指针的静态类型为基类指针,因此在delete的时候只会调用基类的析构函数,而不是调用派生类的析构函数。这样,在派生类中申请的资源就不会得到释放,就会造成内存泄露。如果系统中有大量的派生类对象被这样创建和销毁,就会有内存不断的泄露,久而久之,系统会因为缺少内存而崩溃。

  1. 常量成员: 只能初始化不能赋值,所以必须放在初始化列表中。
  2. 引用类型: 引用必须在定义时初始化,并且不能重新赋值,所以必须放在初始化列表中
  3. 对象成员: 放在初始化列表中,会更高效。
上一篇 下一篇

猜你喜欢

热点阅读