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

何时使用new关键字与智能指针?附C++代码示例问询

何时使用new关键字与智能指针?

咱们先聊聊C++里new和智能指针的适用场景,再结合你给出的代码来分析~

一、适合用new关键字的场景

  • 当你完全能掌控对象的生命周期,并且可以确保一定会手动调用delete释放内存时(比如你代码里main函数手动delete的情况)。不过这种场景现在已经越来越少见了,因为手动管理内存很容易出错。
  • 当你需要和一些老旧的C++代码/底层API交互,这些接口必须接收原始指针的时候;或者你需要分配动态数组(不过更推荐用std::vector替代)。

二、优先使用智能指针的场景

智能指针(比如std::unique_ptr、std::shared_ptr)是RAII机制的典型实现,能自动帮你管理内存,避免泄漏,绝大多数现代C++场景都应该优先考虑:

  • 当你需要在函数中返回动态分配的对象时(就像你写的input函数),用std::unique_ptr返回,调用方根本不用手动释放内存,智能指针会在自身生命周期结束时自动清理。
  • 当多个指针需要共享同一个对象的所有权时,std::shared_ptr可以帮你自动计数,最后一个指针销毁时才释放对象。
  • 在容器中存储动态分配的对象时,用智能指针代替原始指针,能避免容器销毁时内存泄漏的问题。
  • 当代码中可能抛出异常时,智能指针能保证即使异常发生,内存也会被正确释放,而原始指针做不到这一点。

针对你给出的代码的优化建议

你这段代码的写法是可行的,但存在内存泄漏风险:如果main函数中忘了写delete,或者在delete之前st->show()抛出了异常,那分配的student对象就永远不会被释放了。

如果改成用智能指针,代码会更安全简洁:

#include <memory>
#include <iostream>
#include <string>

using namespace std;

class student{ 
public: 
    student(string na, int ag) : name(na), age(ag) {}
    void show() { cout << "Name: " << name << ", Age: " << age << endl; }
private: 
    string name; 
    int age; 
};

std::unique_ptr<student> input(string name, int age) { 
    // 用make_unique更安全,避免构造函数抛出异常时的内存泄漏
    return std::make_unique<student>(name, age); 
} 

int main(){ 
    auto st = input("guagua",25); 
    if(!st){ 
        cout<<"no pointer"<<endl;
    } 
    st->show(); 
    // 无需手动delete!unique_ptr会自动清理内存
    return 0; 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:33:48