何时使用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
相关产品推荐
相关产品推荐

