这是要把前几年积累的C++的节操给丢光吗
来源:互联网 发布:下载淘宝app官方软件 编辑:程序博客网 时间:2024/06/05 05:55
是java把人给养废了还是c++的坑太多?
#include <iostream>#include <string>#include <vector>using namespace std;class A { public: string str; A(const string &s):str(s){} ~A() { cout << "destruct A\n"; }};class Base {};class B: public Base{ public: A a; vector<int> vec; B(const vector<int> &v, A &a1):vec(v), a(a1){}};int main() { //A *a = new A("hello"); //delete a; vector<int> vec(100,5); A a("aaa"); Base *b = new B(vec,a); delete b; return 0;}
上面的程序有问题吗?
很严重的内存泄露。
C++的多态是通过虚函数实现的,要是不把Base的析构函数设为virtual的,在delete时,就调用base的析构函数了,而不是调用B的析构,然后B中有成员变量vec就没法释放了。
解决办法很简单,就是在base中添加个virtual的析构函数就行了。
先回忆下类的构造顺序,先构造基类,再构造派生类
具体的讲就是在构造类的时候,先构造基类,在构造当前类的成员变量,最后调用当前类的构造函数
析构的时候顺序相反
看上面的程序,delete b的时候,因为Base没有virtual的析构函数,所以,只会调用Base的析构函数,而不会调用B的析构函数,因为B的成员变量是在调用B的析构函数只会再析构的,所以,B的成员变量也不会被析构
刚开始看B类,是两个非指针类型的成员变量,所以,即使没有调用B类的默认生成的析构函数,只调用Base类的析构函数,应该也不会有内存泄露。但是,要注意的是,string和vector内部实现都只是一个指针,然后向堆中申请内存,如果不调用默认生成的析构函数,那么也不会析构string和vector,造成内存泄露。
解决方案:如果有继承的话,基类一定要有虚析构函数
- 这是要把前几年积累的C++的节操给丢光吗
- 前几年的回顾
- 我的几年前诗文集
- 使用C#把发表的时间改为几年前,几个月,几天前,几小时前,几分钟前,或几秒前
- 把多年积累的笔记分享给大家
- 几年前初学mysql的笔记(整理)
- 几年前的QTGIS 作品图
- 突然想起来几年前我写的 !
- [几年前的预言]什么是CommonJS?
- 纪念一下几年前的一道考试题
- 前几年的热门领域分析
- 又是几年前的博客
- 给工作几年的技术人员的建议
- 给工作几年的技术人员的建议
- 计算几天前,几小时前,几分钟前,几周前,几个月前,几年前的时间
- 分享一下几年积累下来的推广经验
- 35岁前的积累
- 35岁前的积累
- 欢迎ly48694869重新回归程序员职业
- Linux 关机命令详解
- 全面剖析Linux库文件路径的添加
- Ubuntu 开机自动启动
- gcc编译c语言的uint问题
- 这是要把前几年积累的C++的节操给丢光吗
- Java学习总结之贪吃蛇项目程序编写(完结)
- Linux系统调用
- Windows 7系统下, 使用VC编译OpenSSL静态库步骤
- 编程之美区间重合判断
- 编程之美1.1让CPU占用率曲线听你指挥之解法一细节
- 值得拥有
- STL中的vector
- 二叉树的非递归遍历