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

C++默认参数中的new运算符及其副作用问题

C++默认参数的求值规则:你的疑问解答

嘿,这个问题问到点子上了——这确实是C++默认参数里一个容易让人困惑的细节!先给你一个明确的结论:当你显式传入&x作为实参调用foo时,默认参数的new Int(4)表达式完全不会被求值,也就不会分配那些无法访问的内存。

为什么会这样?

C++标准里明确规定了默认参数的求值时机:只有在调用函数时没有为该参数提供实参的情况下,默认参数的表达式才会被计算并传递给函数。简单说,默认参数就是个“备胎”——只有当你没给正选的时候,它才会上场。

举两个场景对比一下就清楚了:

  • 当你调用 foo(); 时:因为没有传实参,默认参数new Int(4)会被执行,分配一块内存并把指针传给obj。但这里有个大坑:如果函数内部没有主动delete这个指针,这块内存就没人管了,直接造成内存泄漏。
  • 当你调用 foo(&x); 时:你已经显式提供了实参&x,编译器会直接用这个实参,完全不会去碰默认参数的表达式,所以new根本不会被触发,自然没有内存浪费的问题。

额外提醒:这种默认参数写法要谨慎

顺便说一句,你写的这个foo函数其实有个严重的设计问题——如果调用者使用默认参数,分配的内存没有任何释放的途径(调用者不知道这个指针的存在,函数里如果也没处理的话),必然导致内存泄漏。

如果一定要用动态分配的对象作为默认参数,建议用智能指针(比如std::unique_ptr<int>)来管理内存,避免手动分配/释放带来的风险。比如改成:

#include <memory>
int foo(std::unique_ptr<int> obj = std::make_unique<int>(4)) {
    // 处理obj的代码
}

这样不管是用默认参数还是传实参,内存都会被自动管理,不会泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:20:44