c++ unique_ptr共享指针release函数

c++中unique_ptr与share_ptr、weak_ptr的一个经典问题就是release,release函数表示只释放指针,但是内存并不释放,
即release后,内存仍被占用,且其他占用该内存的指针仍然可以正常使用。本人写了如下代码进行解释:

#include<iostream>
#include <memory>
void foo(int *p) {
	std::cout << *p << std::endl;

	std::unique_ptr<int> up;
	up.reset(p);//裸指针转成共享指针

	up.release();//共享指针释放,内存不释放
	up = nullptr;
	std::cout << *p << std::endl;
}
void main() {
	int *p = new int(1111);
	*p = 100;
	foo(p);
	std::cout << *p << std::endl;
	int m=foo(p,1);
	std::cout << *p << std::endl;
	delete p;
}

上述代码中up释放后,main函数中p仍然不受影响。

<think>好的,我现在要处理用户关于C++unique_ptr用法的问题。首先,我需要回忆unique_ptr的基本概念和用途。unique_ptrC++11引入的智能指针,用于管理动态分配的内存,确保资源在不再需要时自动释放,避免内存泄漏。 用户可能想了解如何声明、初始化、使用unique_ptr,以及所有权的转移和释放资源的方法。我需要分步骤解释这些内容,并给出示例代码。还要注意用户提到的系统级指令,比如行内数学表达式用$...$,独立公式用$$...$$,并且用中文回答,生成相关问题。 首先,我应该从unique_ptr的基本定义开始,说明它独占所有权,不能复制,只能移动。然后,介绍创建unique_ptr的方法,比如使用std::make_uniqueC++14引入)或者直接构造函数。需要提到不同创建方式的区别,比如异常安全。 接下来,需要讨论所有权的转移,比如通过std::move将unique_ptr转移给另一个变量,原指针变为nullptr。这部分要举例说明,代码示例会有帮助。 然后,释放资源的方法,比如release()和reset()的区别,以及如何获取原始指针。需要注意使用get()方法时,用户不应手动删除指针,否则会导致双重释放。 另外,自定义删除器也是一个重要点,unique_ptr允许指定自定义的删除器,适用于需要特殊清理的资源,比如文件句柄或网络连接。需要给出一个使用lambda表达式作为删除器的例子。 还需要提到unique_ptr与数组的使用,比如std::unique_ptr<int[]>,并说明C++17中支持数组的operator[]操作符。 在回答中,要确保所有行内代码和数学表达式符合格式要求,比如变量用$...$包裹。例如,在解释所有权时,可以提到指针的所有权转移类似于数学中的赋值操作,但不可逆,比如$x = y$在unique_ptr中必须通过移动语义实现。 需要检查是否有相关的引用可以引用,但根据用户提供的引用,可能没有直接相关的,所以可能不需要添加引用标识,但如果有合适的地方,比如提到线程池中的资源管理,可以引用[^2],但需要自然。 最后,生成相关问题,比如与shared_ptr的区别、自定义删除器的应用场景、性能考虑、在容器中的使用,以及异常安全等。这些问题应该覆盖用户可能进一步感兴趣的方面。 现在需要组织这些内容,确保结构清晰,分点说明,代码示例正确,并且用中文自然表达。同时,检查LaTeX语法是否正确,比如行内公式是否正确使用$...$,独立公式是否用$$...$$并单独成段。可能在这个问题中数学公式较少,但如果有涉及方程或表达式的地方需要正确应用格式。</think>### C++unique_ptr的用法与示例 `unique_ptr`是C++11引入的智能指针,用于**独占式管理动态分配的内存**。它通过RAII(资源获取即初始化)机制确保资源自动释放,避免内存泄漏。以下是其核心用法及示例: --- #### 1. **基本用法** - **声明与初始化**: - 使用`std::make_unique`(C++14起)或直接构造: ```cpp #include <memory> std::unique_ptr<int> p1 = std::make_unique<int>(10); // 推荐方式 std::unique_ptr<int> p2(new int(20)); // 直接构造 ``` - `make_unique`更安全,避免因异常导致的内存泄漏[^1]。 - **访问对象**: ```cpp std::cout << *p1; // 输出10 p1->method(); // 调用成员函数 ``` --- #### 2. **所有权转移** `unique_ptr`不可复制,但可通过`std::move`转移所有权: ```cpp std::unique_ptr<int> p3 = std::move(p1); // p1变为nullptr // 此时*p3 = 10,p1不再持有资源 ``` --- #### 3. **释放资源** - `reset()`:显式释放资源并置空: ```cpp p3.reset(); // 释放内存,p3 = nullptr ``` - `release()`:放弃所有权,返回原始指针(需手动管理): ```cpp int* raw_ptr = p2.release(); // p2变为nullptr,需手动delete raw_ptr ``` --- #### 4. **自定义删除器** 适用于需要特殊清理的资源(如文件句柄): ```cpp auto deleter = [](FILE* f) { fclose(f); }; std::unique_ptr<FILE, decltype(deleter)> file_ptr(fopen("test.txt", "r"), deleter); ``` --- #### 5. **管理数组** 支持动态数组,需指定模板类型为数组: ```cpp std::unique_ptr<int[]> arr = std::make_unique<int[]>(5); arr[0] = 10; // C++17起支持operator[] ``` --- #### 6. **与原始指针的交互** - 获取原始指针(不转移所有权): ```cpp int* raw = p2.get(); // 不要手动delete! ``` --- ### 典型应用场景 1. **替代裸指针**:管理动态分配的对象。 2. **工厂模式**:返回资源所有权明确的对象。 3. **容器存储**:将`unique_ptr`存入容器中,避免拷贝开销: ```cpp std::vector<std::unique_ptr<Widget>> widgets; widgets.push_back(std::make_unique<Widget>()); ``` --- ### 注意事项 - **禁止拷贝**:`unique_ptr`的拷贝构造函数和赋值运算符被删除。 - **性能**:与裸指针几乎无额外开销[^1]。 - **异常安全**:`make_unique`保证异常安全,直接`new`可能泄漏内存。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

._263

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值