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

临时std::shared_ptr解引用后传参是否符合C++规则且安全?

C++临时shared_ptr解引用传递给非const引用的问题解答

1. 代码是否安全合规?

是的,这段代码完全安全且符合C++标准。

临时对象(create_ptr(123)返回的std::shared_ptr<int>实例)的生命周期遵循C++标准规则:临时对象会在完整表达式结束前保持有效。这里的完整表达式就是print(*create_ptr(123))整个函数调用语句。具体来说:

  • 在print函数执行的全过程中,临时shared_ptr始终存在,它管理的堆内存int对象不会被释放
  • 解引用shared_ptr得到的int&引用指向的对象,在print运行期间完全有效
  • 只有当print执行完毕、整个语句结束后,临时shared_ptr才会被销毁,此时才会释放堆上的int对象

因此不存在悬空引用的风险,行为完全符合预期。

2. 为什么没有触发编译错误?

你之前误以为会编译错误,大概率是混淆了非const左值引用的绑定规则。

C++标准规定非const左值引用(int&)不能直接绑定到临时对象,但这里的情况并不属于这种禁忌场景:

  • *create_ptr(123)解引用shared_ptr后得到的是堆上int对象的左值引用,而非临时int对象
  • 这个左值引用指向的对象有明确的生命周期(由临时shared_ptr托管,直到语句结束),完全满足非const左值引用的绑定要求,因此编译器不会报错

附测试代码

#include <iostream>
#include <memory>

std::shared_ptr<int> create_ptr(int val)
{
    return std::make_shared<int>(val);
}

void print(int& val)
{
    std::cout << "*** Print value: " << val << '\n';
}

int main()
{
    print(*create_ptr(123)); // 为何能正常运行?
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:35:07