polymorph.cpp里面的“析构函数、智能指针”问题

源代码:

cpp 复制代码
#include <iostream>
// /*
struct Base 
{
    virtual void f(){}
};
struct Derived:Base 
{
    void f() override {}
};
int main()
{
    Base *p = new Derived;
    return 0;
}
// */

/*
#include <memory>

struct Base 
{
    virtual void f() {}
    //virtual ~Base() = default;
};

struct Derived : Base 
{
    void f() override {}
};

int main()
{
    std::unique_ptr<Base> p = std::make_unique<Derived>();
    p->f();
    std::cout << "  Derived class object is created and function f() is called." << std::endl;
}

*/

分析 polymorph.cpp 中的问题与修复建议

文件分析

文件中包含了两段代码,都被注释掉了第一段。逐一分析:

第一段代码(第 2-15 行,被 /* */ 注释)

cpp 复制代码
struct Base
{
    virtual void f(){}
};
struct Derived:Base
{
    void f() override {}
};
int main()
{ 
    Base *p = new Derived;
    return 0;
}

存在的问题:

  1. 内存泄漏 :使用 new Derived 创建了对象,但从未调用 delete 来释放内存。
  2. 缺少析构函数:基类没有虚析构函数,在多态使用时可能导致资源泄漏。

第二段代码(第 18-39 行,被 /* */ 注释)

cpp 复制代码
struct Base
{
    virtual void f() {}
    //virtual ~Base() = default;
};
struct Derived : Base
{
    void f() override {}
};
int main()
{
    std::unique_ptr<Base> p = std::make_unique<Derived>();
    p->f();
    std::cout << "  Derived class object is created and function f() is called." << std::endl;
}

这段代码是正确的:

  1. 使用了智能指针 std::unique_ptr 避免泄漏。
  2. 虚函数正常工作。
  3. 如果取消注释第 24 行的虚析构函数会更好。

建议的修复方案

方案一:手动管理内存(添加虚析构函数 + delete)

cpp 复制代码
#include <iostream>

struct Base
{
    virtual void f(){}
    virtual ~Base() = default;  // 添加虚析构函数
};

struct Derived : Base
{
    void f() override {}
};

int main()
{
    Base *p = new Derived;
    delete p;  // 释放内存
    return 0;
}

方案二:使用智能指针(推荐)

cpp 复制代码
#include <iostream>
#include <memory>

struct Base
{
    virtual void f(){}
    virtual ~Base() = default;
};

struct Derived : Base
{
    void f() override {}
};

int main()
{
    std::unique_ptr<Base> p = std::make_unique<Derived>();
    return 0;
}

总结

主要问题就是内存管理 和虚析构函数缺失 。在涉及多态的场景中,基类应始终提供虚析构函数,并优先使用智能指针来避免手动 new/delete 带来的泄漏风险。

相关推荐
科技苑16 小时前
C++ CAS与ABA问题详解,无锁编程的经典陷阱怎么解决?
c++·人工智能
czq_268671948717 小时前
Python打卡第46天
开发语言·python
Evand J19 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
BaiPeter20 小时前
ZPL文件预览
开发语言·c++
悠仁さん1 天前
【C++】哈希表
c++·算法·散列表
Severus_black1 天前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
噢,我明白了1 天前
JAVA中的一些基础应用知识点
java·开发语言
时间的拾荒人1 天前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
敲上瘾1 天前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
码途行者1 天前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php