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 带来的泄漏风险。

相关推荐
心中有你02144 分钟前
C 语言文件操作详解:从写入、追加到读取与定位的完整 实战
c语言·开发语言
小张成长计划..16 分钟前
【Linux】26:线程互斥和同步
java·开发语言
阿里嘎多学长8 小时前
2026-10-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
布吉岛的石头9 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
小羊没烦恼!9 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
quantdash_cc10 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
昂好的day11 小时前
VisionMaster 通信模块实战(上):Modbus、TCP 收发、协议组装解析
开发语言·网络·网络协议·tcp/ip·c#
努力实干12 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
NetX行者13 小时前
四语言 Hello World 背后:编译模型与运行时对比
开发语言
Pin_Qing14 小时前
账单没超,请求先被拒了
大数据·开发语言·人工智能