这是要把前几年积累的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,造成内存泄露。


解决方案:如果有继承的话,基类一定要有虚析构函数



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子年龄报小了怎么办 招工档案年龄有涂改怎么办 退伍军被别人顶替上班怎么办 二孩政策前生的怎么办 孩子晕车怎么办最有效方法得当 事业单位编外人员改革工伤怎么办 工伤仲裁后法院一审判决后怎么办 我媳妇删了我该怎么办 老婆离家出走不照顾小孩怎么办 车停在4s店损坏怎么办 车辆年检贴丢了怎么办 卖衣服别人嫌贵怎么办 武汉铁路医保卡丢了怎么办 高铁列车员年龄大了怎么办 尚客优酒店会员怎么办 钢铁雄心4人力不足怎么办 未经车主同意私自将车卖了怎么办 剧本给几个制片人看过怎么办 没有产品经理ui设计师怎么办 老板请朋友吃饭司机应该怎么办 被化妆学校坑了怎么办 快车约得太远怎么办 工资好低2000多怎么办 苹果手机不能下载软件怎么办 苹果手机下不了软件怎么办 苹果6s下不了软件怎么办 苹果6下不了软件怎么办 ipad更新系统卡住了怎么办 ipad卡住了关不了机怎么办 ipad卡住了没反应怎么办 苹果7下不了软件怎么办 苹果手机开机密码忘了怎么办 苹果开机密码忘了怎么办 我的ipad很卡怎么办 6s升级后卡顿严重怎么办 软件升级后手机卡顿怎么办 ps通道抠图模糊怎么办 电脑锁屏死机了怎么办 ipad电源键坏了怎么办 华为平板死机黑屏了怎么办 苹果4s锁屏键坏了怎么办