当前位置: 首页 > web >正文

std::unique_ptr的get方法

2025年4月29日,周二中午


std::unique_ptr::get() 是 C++ 标准库中 std::unique_ptr 智能指针的成员函数,用于获取其管理的原始指针(raw pointer),但不转移所有权。以下是关键点解析:


  1. 核心功能
    • 返回值:返回指向 std::unique_ptr 所管理对象的原始指针(T* 类型)。

• 所有权不变:调用 get() 后,std::unique_ptr 仍独占资源所有权,生命周期结束时自动释放资源。


  1. 典型用途
    • 传递指针给外部函数:当函数需要访问对象但不需要接管所有权时。
void process(int* ptr) { /* 使用 ptr 但不释放 */ }
std::unique_ptr<int> p = std::make_unique<int>(42);
process(p.get());  // 安全传递原始指针

• 调试或日志:打印指针地址或检查对象状态。


  1. 注意事项
    • 悬垂指针风险:若 std::unique_ptr 被释放或重置(如 reset() 或离开作用域),通过 get() 获取的指针将失效。
int* raw_ptr = p.get();
p.reset();        // 释放资源
// raw_ptr 现在悬空,访问会导致未定义行为!

• 禁止手动释放:不可对 get() 返回的指针调用 delete,否则会重复释放。


  1. 对比其他方法
    release():释放所有权并返回原始指针,std::unique_ptr 变为空。需手动管理释放。
int* raw_ptr = p.release();  // p 不再管理资源
delete raw_ptr;              // 需手动释放

  1. 示例代码
#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 的生命周期覆盖对原始指针的使用。

http://www.xdnf.cn/news/2913.html

相关文章:

  • Prometheus使用Recoding Rules优化性能
  • antd+react实现html图片预览效果
  • 人事管理系统6
  • react-native 安卓APK打包流程
  • 【Linux学习笔记】进程替换和自定义shell
  • 自动化立库/AGV物流仿真详细步骤
  • MarkItDown:如何高效将各类文档转换为适合 LLM 处理的 Markdown 格式
  • Objective-C Block 底层原理深度解析
  • Hearts of Iron IV 钢铁雄心 4 [DLC 解锁] [Windows SteamOS macOS]
  • 基于tabula对pdf中多个excel进行识别并转换成word中的优化(四)
  • 防爆风扇储能轴流风机风量风压如何保障通风安全?
  • dify1.3.1更新又给我们带来了什么?
  • 已知条件概率,反推设计值
  • Vue3取消网络请求的方法(AbortController)
  • android开发中的多线程、数据存储同步功能实现方案和应用场景
  • 【SpringBoot】基于MybatisPlus的博客管理系统(1)
  • 常见的硬盘分类
  • SpringBoot、微服务与AI场景题深度解析
  • neo4j基础操作:命令行增删改查
  • java web 过滤器
  • 华为云IAM用户权限设置主要有哪些问题需要注意?
  • 医疗生态全域智能化:从技术革新到价值重塑的深度探析
  • 激光驱鸟:以科技重构生态防护边界
  • JavaAPI — 包装类与正则表达式
  • 从厨房到云端:从预制菜到云原生
  • kotlin flatMap 变换函数的特点和使用场景
  • SpringBoot Actuator未授权访问漏洞的全面解析与解决方案
  • 【uom】 0 配置文件(Cargo.toml)
  • vscode chrome调试怎么在所有浏览器都好使
  • jmeter-Beashell获取请求body data