如何将示例代码中的原生指针替换为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
相关产品推荐
相关产品推荐

