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

C++中动态创建对象指针的不同方式及相关疑问

针对你的C++智能指针使用疑问的解答

首先明确:你的场景(仅一处使用、无需复制)下,选择std::unique_ptr完全正确,它的独占所有权特性正好匹配你的需求。

接下来逐个解答你的疑问:

1. a3和a4是否都无需手动delete?

是的,完全不需要手动调用delete。std::unique_ptr的核心作用就是自动管理内存:当它离开作用域时,会自动触发自身的析构函数,在析构过程中释放持有的堆内存。

2. std::unique_ptr出作用域时,类的析构函数是否会被调用?

会的。std::unique_ptr在释放内存前,会先调用指向对象的析构函数,再执行内存释放操作(相当于自动帮你完成了delete的完整逻辑:先析构对象、再释放内存)。这不仅能避免内存泄漏,还能保证对象持有的资源(比如打开的文件、申请的其他内存)被正确清理。

3. 还有其他可选方式吗?

如果你的对象不需要在堆上分配(比如对象体积不大,且生命周期和当前作用域完全一致),直接在栈上声明对象是更简单高效的选择:

A a(5);
// Do stuff

栈对象会在离开作用域时自动析构,不需要任何手动内存管理,性能也比堆分配更优。

只有当你确实需要堆分配的场景(比如对象体积过大超出栈空间、需要将对象生命周期延长到当前作用域外等),才需要考虑智能指针。

4. a3和a4哪种是最佳选择?

优先选择a4的std::make_unique<A>(4)方式,原因有两点:

  • 异常安全性:std::make_unique将内存分配和智能指针构造封装为一个原子操作。如果用a3的方式(先new A(3)再构造unique_ptr),万一在new之后、unique_ptr构造之前发生异常(比如其他代码抛出异常),裸指针会直接导致内存泄漏;而make_unique不会出现这种问题。
  • 代码简洁性:写法更简洁,不需要手动写new,也避免了裸指针的暴露。

另外,你的代码里std::unique_ptr<A> a3 = nullptr;可以简化为std::unique_ptr<A> a3;,默认构造的unique_ptr本身就是空的,不需要显式赋值nullptr,a4同理。

最后补充:你的判断完全正确——a1的malloc/free方式在C++里处理对象时几乎没有实用价值(因为无法调用构造/析构函数,会导致对象状态异常);a2的裸指针+new/delete需要手动管理内存,容易在复杂场景(比如异常、分支跳转)下出现泄漏,应该尽量避免。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:00:49