You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将示例代码中的原生指针替换为unique_ptr?

改用unique_ptr的修改方案

核心修改点

  • 给基类Airline添加虚析构函数:确保通过基类智能指针销毁派生类对象时,能正确执行所有析构逻辑。
  • 将unordered_map的类型从Airline*改为std::unique_ptr<Airline>:让智能指针自动管理内存,彻底避免手动delete的风险。
  • 用std::make_unique创建派生类对象:替代裸new,更安全且符合现代C++规范。
  • 移除main函数中的delete语句:unique_ptr会在map生命周期结束时自动释放对象,手动delete会触发重复释放错误。

修改后的完整代码

#include <iostream>
#include <unordered_map>
#include <vector>
#include <memory> // 必须包含该头文件以使用unique_ptr和make_unique

using namespace std;

class Airline {
public:
    virtual double TicketCost(double miles, string class_name) = 0;
    // 添加虚析构函数,确保派生类对象能正确销毁
    virtual ~Airline() = default;
protected:
    double OperatingCost(double miles, string class_name);
};

double Airline::OperatingCost(double miles, string class_name){
    return 50 + 0.25*miles;
}

class Delta : public Airline {
public:
    double TicketCost(double miles, string class_name) override{
        return 1.0*miles + OperatingCost(miles, class_name);
    }
};

class Southwest : public Airline {
public:
    double TicketCost(double miles, string class_name) override{
        if(class_name=="Economy"){
            return 0.5*miles + 50;
        }
        else{
            return 150.0;
        }
    }
};

// 修改map类型为unique_ptr<Airline>,用make_unique创建对象
unordered_map<string, unique_ptr<Airline>> airline_map{
    {"Delta", make_unique<Delta>()},
    {"Southwest", make_unique<Southwest>()}
};

vector<vector<string>> input{
    {"Delta", "100.0", "Economy"},
    {"Southwest", "150.0", "Business"}
};

int main()
{
    for(const auto& vec_string: input){
        const string& airline_name = vec_string[0];
        const double miles = stod(vec_string[1]);
        const string& class_name = vec_string[2];
        
        // 两种调用方式任选其一:
        // 方式1:通过.get()获取原生指针
        Airline* airline_ptr = airline_map[airline_name].get();
        cout << airline_ptr->TicketCost(miles, class_name) << endl;
        
        // 方式2:直接使用智能指针的->操作符(更简洁)
        // cout << airline_map[airline_name]->TicketCost(miles, class_name) << endl;
    }
    return 0;
}

关键说明

  • std::unique_ptr是独占式智能指针,同一时间只有一个unique_ptr持有对象所有权,从根源上避免内存泄漏和重复释放问题。
  • make_unique是C++14引入的标准工具,相比直接new,它能避免构造函数抛异常时的内存泄漏风险。
  • 虚析构函数是必加项:如果基类没有虚析构,unique_ptr销毁基类指针时只会调用基类析构函数,派生类的资源清理逻辑不会执行,若派生类持有堆内存或文件句柄等资源,会直接导致泄漏。

内容的提问来源于stack exchange,提问作者HotRod717

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:39:54