总结
豆包 AI 助手文章总结
首页 > 后端开发 > C++ > 正文

C++的std::unique_ptr关键字有什么用途?怎么用?

冰火之心
发布: 2025-06-06 13:33:01
原创
339人浏览过

std::unique_ptr是c++++11引入的智能指针,用于实现独占式所有权的资源管理。其核心用途是确保某个资源只能被一个指针拥有,并在离开作用域时自动释放,避免内存泄漏;“独占式”意味着资源不能被复制,但可以通过移动语义转移所有权;创建方式包括使用new直接初始化、推荐的std::make_unique以及管理数组类型的带[]删除器形式;访问资源可通过*和->操作符进行;所有权转移通过std::move实现,转移后原指针为空;常见注意事项包括不要手动delete资源、可安全放入容器中使用、支持自定义删除器以管理非内存资源。

C++的std::unique_ptr关键字有什么用途?怎么用?

std::unique_ptr 是 C++11 引入的一种智能指针,用来管理动态分配的对象,它的核心用途是实现独占式所有权的资源管理。说白了,就是确保某个资源(通常是堆内存)只能被一个指针拥有,并在它不再需要时自动释放,避免内存泄漏。


什么是“独占式”?

“独占式”意味着 std::unique_ptr 所指向的对象不能被复制给另一个 unique_ptr。也就是说,你不能写这样的代码:

std::unique_ptr<int> p1(new int(5));
std::unique_ptr<int> p2 = p1; // 编译错误!
登录后复制

这和 std::shared_ptr 不一样,后者允许多个指针共享同一个对象的所有权。而 unique_ptr 的设计目的就是为了更明确地表达:这个资源只能有一个主人,谁离开作用域谁就负责释放。

立即学习C++免费学习笔记(深入)”;


怎么创建和使用 std::unique_ptr?

常见的用法其实很简单,一般有以下几种方式:

  • 使用 new 直接初始化:

    std::unique_ptr<int> ptr(new int(10));
    登录后复制
  • 使用 std::make_unique(推荐):

    auto ptr = std::make_unique<int>(10);
    登录后复制

    这种方式更安全,也更简洁,推荐优先使用。

  • 管理数组类型(注意要用带 [] 的删除器):

    auto arr = std::make_unique<int[]>(5); // 创建长度为5的int数组
    登录后复制

访问内部对象也很简单,就像普通指针一样用 * 和 -> 操作符:

auto user = std::make_unique<User>("Alice");
std::cout << user->getName() << std::endl;
登录后复制

如何转移所有权?

虽然 unique_ptr 不支持拷贝,但可以移动(move)。比如你可以把它作为函数返回值或者参数传递出去:

std::unique_ptr<int> createInt() {
    return std::make_unique<int>(42);
}

void useInt(std::unique_ptr<int> ptr) {
    std::cout << *ptr << std::endl;
}
登录后复制

调用方式如下:

auto p = createInt(); // 所有权从函数内转移到p
useInt(std::move(p)); // 转移后,p变成空指针
登录后复制

注意:一旦移动之后,原来的指针就不再拥有资源了,相当于 null。


常见注意事项

  • 不要手动 delete:用了 unique_ptr 就不需要也不应该手动调用 delete。

  • 配合容器使用没问题:可以把 unique_ptr 放进 std::vector 或 std::map 中,只要不涉及拷贝操作就行。

  • 自定义删除器(高级用法):如果你管理的不是普通 new 出来的内存,比如文件句柄、socket 等资源,可以通过模板指定自定义删除逻辑。

    struct MyDeleter {
        void operator()(FILE* fp) const { fclose(fp); }
    };
    
    std::unique_ptr<FILE, MyDeleter> fp(fopen("file.txt", "r"));
    登录后复制

基本上就这些。理解起来不难,但确实很容易因为习惯写法而出错,特别是刚从裸指针转过来的时候。用多了你会发现,std::unique_ptr 不仅能帮你省去手动管理内存的麻烦,还能让代码结构更清晰。

以上就是C++的std::unique_ptr关键字有什么用途?怎么用?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
豆包 AI 助手文章总结
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号