首页 > 后端开发 > C++ > 正文

c++中如何使用unique_ptr管理对象_c++ unique_ptr用法详解

裘德小鎮的故事
发布: 2025-10-04 14:00:02
原创
924人浏览过
unique_ptr是C++11引入的独占式智能指针,通过move语义转移所有权,离开作用域时自动释放内存,支持make_unique创建、自定义删除器、数组管理及作为函数参数返回值使用,避免内存泄漏且零开销。

c++中如何使用unique_ptr管理对象_c++ unique_ptr用法详解

unique_ptr 是 C++11 引入的智能指针,用于自动管理动态分配的对象生命周期。它通过独占所有权机制确保同一时间只有一个 unique_ptr 指向某个对象,当指针离开作用域时,自动调用 delete 释放内存,防止内存泄漏。

1. 基本用法:创建和初始化 unique_ptr

使用 std::make_unique(C++14 起推荐)或直接构造来创建 unique_ptr。

#include <memory>
#include <iostream>

示例:

std::unique_ptr<int> ptr1 = std::make_unique<int>(42);
std::unique_ptr<std::string> ptr2 = std::make_unique<std::string>("Hello");

也可以用原始指针构造(不推荐直接使用 new):

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

std::unique_ptr<int> ptr3(new int(10)); // 合法但不如 make_unique 安全

2. 独占所有权:不能复制,只能移动

unique_ptr 不支持拷贝构造和赋值,只能通过 move 语义转移所有权。

错误示例(编译失败):

auto ptr = std::make_unique<int>(5);
auto ptr2 = ptr; // 错误:不能复制

正确方式(使用 std::move):

auto ptr2 = std::move(ptr); // 所有权转移,ptr 变为 nullptr

转移后原指针为空,不能再访问:

if (!ptr) {
  std::cout << "ptr is null now\n";
}

3. 访问和操作所管理的对象

提供两种常用操作符:

  • *ptr:解引用获取对象值
  • ptr->:调用对象成员函数

示例:

class MyClass {
public:
  void say() { std::cout << "Hello!\n"; }
};

auto obj = std::make_unique<MyClass>();
obj->say(); // 调用成员函数
*obj = MyClass(); // 赋新值

4. 自定义删除器(Deleter)

某些场景需要自定义资源释放逻辑,比如关闭文件、释放数组等。

AppMall应用商店
AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56
查看详情 AppMall应用商店

示例:管理数组

std::unique_ptr<int[]> arr = std::make_unique<int[]>(10);
arr[0] = 1; // 使用 [] 访问元素

自定义删除器示例:

auto deleter = [](FILE* f) {
  if (f) fclose(f);
};
std::unique_ptr<FILE, decltype(deleter)> file(fopen("test.txt", "w"), deleter);

文件在 unique_ptr 析构时自动关闭。

5. 作为函数参数和返回值

传递 unique_ptr 通常使用 move 或以引用形式避免所有权转移。

函数接收:

void func(std::unique_ptr<int> ptr) {
  std::cout << *ptr << "\n"; // 获取值
} // ptr 在此释放

调用时需 move:

auto p = std::make_unique<int>(42);
func(std::move(p));

函数返回 unique_ptr(常见于工厂模式):

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

6. 与 raw pointer 交互

必要时可获取原始指针,但要小心使用:

int* raw = ptr.get(); // 获取裸指针,不转移所有权

重置或释放资源:

ptr.reset(); // 释放对象,ptr 变为 nullptr
ptr.reset(new int(5)); // 替换管理的新对象
auto released = ptr.release(); // 返回裸指针,ptr 变空,需手动 delete

基本上就这些。unique_ptr 设计简洁高效,几乎零开销,是管理单个堆对象的首选智能指针。掌握它的移动语义和生命周期控制,能显著提升代码安全性和可维护性。

以上就是c++++中如何使用unique_ptr管理对象_c++ unique_ptr用法详解的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

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

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