分析polymorph.cpp中的问题与修复建议
文件分析
文件中包含了两段代码,都被注释掉了第一段。逐一分析:
第一段代码(第 2-15 行,被/* */注释)
structBase{virtualvoidf(){}};structDerived:Base{voidf()override{}};intmain(){newDerived;return0;}存在的问题:
- 内存泄漏:使用
new Derived创建了对象,但从未调用delete来释放内存。 - 缺少析构函数:基类没有虚析构函数,在多态使用时可能导致资源泄漏。
第二段代码(第 18-39 行,被/* */注释)
structBase{virtualvoidf(){}Base()=default;};structDerived:Base{voidf()override{}};intmain(){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;}这段代码是正确的:
- 使用了智能指针
std::unique_ptr避免泄漏。 - 虚函数正常工作。
- 如果取消注释第 24 行的虚析构函数会更好。
建议的修复方案
方案一:手动管理内存(添加虚析构函数 + delete)
#include<iostream>structBase{virtualvoidf(){}virtual~Base()=default;// 添加虚析构函数};structDerived:Base{voidf()override{}};intmain(){Base*p=newDerived;deletep;// 释放内存return0;}方案二:使用智能指针(推荐)
#include<iostream>#include<memory>structBase{virtualvoidf(){}virtual~Base()=default;};structDerived:Base{voidf()override{}};intmain(){std::unique_ptr<Base>p=std::make_unique<Derived>();return0;}总结
主要问题就是内存管理和虚析构函数缺失。在涉及多态的场景中,基类应始终提供虚析构函数,并优先使用智能指针来避免手动new/delete带来的泄漏风险。