临时std::shared_ptr解引用后传参是否符合C++规则且安全?
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
相关产品推荐
相关产品推荐

