首页 新闻 赞助 找找看

C++ 基类堆内存释放问题

0
悬赏园豆:100 [已解决问题] 解决于 2020-08-20 14:53

B站的一个C++视频
基类如下:

class Worker{
public:
    // 显示个人信息
    virtual void showInfo() = 0;
    // 获取部门名称
    virtual string getDeptName() = 0;
    int m_Id;  //职工编号
    string m_Name;  // 职工姓名
    int m_DeptId;  // 职工部门编号
};

子类如下:

class Employee : public Worker{
public:
    // 构造函数
    Employee(int id,string name,int deptId);
    // 显示个人信息
    virtual void showInfo();
    // 获取部门信息
    virtual string getDeptName();
};

Worker * worker = NULL;
worker = new Employee(1,"name",1);
delete worker; //这里不行,xcode有警告 Delete called on 'Worker' that is abstract but has non-virtual destructor

怎么才能释放worker指向的堆内存?搞不懂!求大佬指教!

C++
顾wenfan的主页 顾wenfan | 初学一级 | 园豆:112
提问于:2020-08-19 15:02
< >
分享
最佳答案
1

会长大佬已经给出实际操作的解决方法了,就是加上虚析构函数就行了。我来讲一下原理
1.这是一个内存泄露的问题。
//2.代码的部分流程为:(例子)对指针pt应用运算符delete时,将调用动态对象*pt的析构函数。

3.派生类可以分配内存或保留对销毁对象时需要清除的其他资源的引用。如果不为接口/抽象类提供虚拟析构函数,则每次通过基类指针删除派生类实例时,都不会调用派生类的析构函数。也就意味着内存泄漏。

4.虚析构函数将允许基类指针将派生类的对象安全的删除。

参考链接:

https://stackoverflow.com/questions/270917/why-should-i-declare-a-virtual-destructor-for-an-abstract-class-in-c

https://blog.csdn.net/qiuen311/article/details/24302759

收获园豆:80
Conan-jine | 小虾三级 |园豆:1272 | 2020-08-19 19:54

明白了,已经采纳

顾wenfan | 园豆:112 (初学一级) | 2020-08-20 14:52
其他回答(2)
0

加上析构函数试试

收获园豆:20
会长 | 园豆:12401 (专家六级) | 2020-08-19 15:18

往那里加呢?不能在抽象类 Worker上加吧

支持(0) 反对(0) 顾wenfan | 园豆:112 (初学一级) | 2020-08-19 15:25

这是上转型的对象,写析构函数写那个上面呢?

支持(0) 反对(0) 顾wenfan | 园豆:112 (初学一级) | 2020-08-19 15:28

@顾wenfan: 试试,我也不知道。我手头没有环境,试不了

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2020-08-19 15:54

@会长: 刚在知乎上查到了,在基类上加上 虚析构函数
virtual ~Worker(){}
就可以解决,不指导为什么

支持(0) 反对(0) 顾wenfan | 园豆:112 (初学一级) | 2020-08-19 15:57

@顾wenfan: 我也不知道,10多年没写过C++了....

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2020-08-19 16:56
0

条款 如果类存在虚函数,如果类要作为基类的话,一定要在析构函数定义为virtual

夏大王 | 园豆:214 (菜鸟二级) | 2020-09-30 17:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册