静态函数返回std::shared_ptr时引用计数能否归0?
直接结论:引用计数可以正常归0,对应的MyObject对象会在最后一个持有它的std::shared_ptr被销毁时自动释放,不会一直保留到程序退出。
具体分析:
初始引用计数:通过
std::make_shared<MyObject>()创建的std::shared_ptr,内部引用计数初始值为1。当这个智能指针返回给调用方时,所有权会随复制/转移操作传递,引用计数会根据操作相应增减。引用计数的变化与释放逻辑:
- 每将该
shared_ptr赋值给新的shared_ptr或用它初始化新实例,引用计数加1; - 每一个持有该对象的
shared_ptr被销毁(比如局部变量离开作用域、被赋值为nullptr、从容器中移除),引用计数减1; - 当引用计数降到0时,
shared_ptr会自动调用MyObject的析构函数,并释放make_shared分配的内存(包含对象本身和shared_ptr的控制块)。
- 每将该
对比原代码的优势:
原代码返回原始指针时,需调用方手动执行delete释放内存,极易因遗漏造成内存泄漏;修改后的shared_ptr实现了内存自动管理,只要调用方正常使用(不刻意保留全局级引用等),就不会出现泄漏问题。
特殊情况说明:
如果调用方将返回的shared_ptr存入全局变量、静态变量或生命周期贯穿整个程序的容器,那么对象会直到这些变量被销毁(通常是程序退出时)才会释放,但这属于调用方的使用场景问题,并非createSharedPointer函数本身的设计导致。
内容的提问来源于stack exchange,提问作者André Lehto
相关产品推荐
相关产品推荐

