std::unique_ptr的get方法
2025年4月29日,周二中午
std::unique_ptr::get()
是 C++ 标准库中 std::unique_ptr
智能指针的成员函数,用于获取其管理的原始指针(raw pointer),但不转移所有权。以下是关键点解析:
- 核心功能
• 返回值:返回指向std::unique_ptr
所管理对象的原始指针(T*
类型)。
• 所有权不变:调用 get()
后,std::unique_ptr
仍独占资源所有权,生命周期结束时自动释放资源。
- 典型用途
• 传递指针给外部函数:当函数需要访问对象但不需要接管所有权时。
void process(int* ptr) { /* 使用 ptr 但不释放 */ }
std::unique_ptr<int> p = std::make_unique<int>(42);
process(p.get()); // 安全传递原始指针
• 调试或日志:打印指针地址或检查对象状态。
- 注意事项
• 悬垂指针风险:若std::unique_ptr
被释放或重置(如reset()
或离开作用域),通过get()
获取的指针将失效。
int* raw_ptr = p.get();
p.reset(); // 释放资源
// raw_ptr 现在悬空,访问会导致未定义行为!
• 禁止手动释放:不可对 get()
返回的指针调用 delete
,否则会重复释放。
- 对比其他方法
•release()
:释放所有权并返回原始指针,std::unique_ptr
变为空。需手动管理释放。
int* raw_ptr = p.release(); // p 不再管理资源
delete raw_ptr; // 需手动释放
- 示例代码
#include <memory>
#include <iostream>int main() {auto ptr = std::make_unique<int>(100);std::cout << "Value: " << *ptr << ", Address: " << ptr.get() << std::endl;int* raw = ptr.get();std::cout << "Via raw pointer: " << *raw << std::endl; // 安全访问ptr.reset(); // 释放资源// std::cout << *raw; // 危险!悬垂指针
}
总结
• 适用场景:临时获取指针且无需转移所有权时使用 get()
。
• 安全准则:确保 std::unique_ptr
的生命周期覆盖对原始指针的使用。