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仍然不受影响。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
`std::unique_ptr` 是 C++ 标准库中的一个智能指针类模板,用于管理动态分配的对象。它提供了对动态分配对象的所有权管理,并在对象不再需要时自动释放内存。 `std::unique_ptr` 的特点如下: - 独占式所有权:一个 `std::unique_ptr` 对象只能拥有一个指针,且它是唯一拥有该指针的对象。 - 自动内存管理:当 `std::unique_ptr` 被销毁时(例如,离开作用域),它所拥有的对象会自动被删除,从而释放内存。 - 不可复制:`std::unique_ptr` 不能进行复制操作,以确保只有一个对象拥有指针。但是可以进行移动操作,将所有权转移到另一个 `std::unique_ptr`。 以下是 `std::unique_ptr` 的一些常见用法: 1. 创建 `std::unique_ptr` 对象: ```cpp std::unique_ptr<T> ptr(new T); // 创建一个指向类型 T 的动态分配对象的 unique_ptr ``` 或者使用 `std::make_unique`(C++14 引入): ```cpp auto ptr = std::make_unique<T>(args); // 创建一个指向类型 T 的动态分配对象的 unique_ptr,使用 args 初始化对象 ``` 2. 获取指向对象的原始指针: ```cpp T* rawPtr = ptr.get(); // 获取指向对象的原始指针 ``` 3. 释放 `std::unique_ptr` 对象的所有权: ```cpp T* releasedPtr = ptr.release(); // 释放 unique_ptr 对象的所有权,返回指向对象的原始指针 ``` 4. 重置 `std::unique_ptr` 对象: ```cpp ptr.reset(); // 重置 unique_ptr 对象,释放对象并将指针置为空 ``` 或者用新的指针重置: ```cpp ptr.reset(new T); // 重置 unique_ptr 对象,指向新的动态分配对象 ``` 5. 使用 `std::unique_ptr` 对象: ```cpp ptr->memberFunction(); // 调用指向对象的成员函数 (*ptr).memberFunction(); // 通过解引用指针调用成员函数 ``` `std::unique_ptr` 还可以与容器(如 `std::vector`、`std::list` 等)一起使用,用于管理容器中的动态分配对象。 使用 `std::unique_ptr` 可以简化内存管理,避免内存泄漏和悬空指针等问题,并提高代码的可读性和安全性。 希望以上解释对你有所帮助。如果你有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

._263

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

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

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

打赏作者

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

抵扣说明:

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

余额充值