C++ unique_ptr

本文介绍了C++中unique_ptr的独特性质,它确保对象的独占所有权。unique_ptr提供了如reset()和release()等方法来管理对象的生命周期。虽然没有内置的make_unique,但在某些版本后已加入。文章还讨论了unique_ptr的拷贝行为,强调了在对象即将释放或离开作用域时的特殊情况。此外,建议使用make_unique避免与原始指针操作混淆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

另一种智能指针,和shared_ptr不一样的是,它能独享所指向的对象,也就是如果有计数器,计数器的值必须小于等于1。
常用方法

u=nullptr释放u指向的对象,将u置为空
u.release()u返回指针,并放弃对指针的控制权,置位空
u.reset(q)u指向q

对于unique_ptr的构造方法,C++ primer说没有提供类似于make_shared的方法,所以只能指向一个new返回的指针,但似乎在某个版本之后有了make_unique,我的看法是就用这个,尽量不要跟普通指针扯上关系,原因可以参考我上面shared_ptr的博客。

另外值得一提的就是unique_ptr的拷贝,照理说由于是专享对象,所以这个指针是不能拷贝的,因为一旦拷贝了,指向对象的指针至少就有两个了,但C++允许即将放弃对象或被释放的unique_ptr的拷贝,这里提供几种拷贝方式:

unique_ptr<int>p(p1.release())p1即将被释放,所以p可以拷贝p返回的指针。

p.reset(p1.release())p放弃原有对象,指向p1放弃的对象。

unqiue_ptr<int> clone(int p)
{
	return unique_ptr<int>(new int(p)); //指针即将离开作用域,所以可以拷贝。
}
### C++ `unique_ptr` 使用方法及示例 #### 创建和初始化 `unique_ptr` `std::unique_ptr` 是一种独占所有权的智能指针,意味着同一时间只有一个 `unique_ptr` 实例拥有该资源。创建 `unique_ptr` 的方式有多种: ```cpp #include <iostream> #include <memory> using namespace std; void demonstrate_unique_ptr_creation() { // 方法一:通过 make_unique 函数 (推荐) auto ptr1 = make_unique<int>(42); // 方法二:直接调用构造函数 unique_ptr<int> ptr2(new int(84)); cout << "Value of ptr1: " << *ptr1 << endl; cout << "Value of ptr2: " << *ptr2 << endl; } ``` #### 返回 `unique_ptr` 作为函数返回值 由于 `unique_ptr` 支持移动语义而非拷贝语义,因此可以直接从函数中返回它而无需担心深浅拷贝问题。 ```cpp unique_ptr<int> create_and_return_unique_ptr(int value) { return make_unique<int>(value); } void use_function_to_create_unique_ptr() { unique_ptr<int> returnedPtr = create_and_return_unique_ptr(99); cout << "Returned unique_ptr points to: " << *returnedPtr << endl; } ``` #### 将 `unique_ptr` 存储于标准库容器内 当需要存储动态分配的对象集合时,可以考虑使用包含 `unique_ptr` 的 STL 容器来管理这些对象的生命期。 ```cpp void store_in_container() { vector<unique_ptr<string>> stringPointers; // 添加新元素到向量中 stringPointers.push_back(make_unique<string>("Hello")); stringPointers.emplace_back(new string("World")); for(auto& p : stringPointers){ cout << *p << ' '; } cout << endl; } ``` 以上展示了如何利用 `make_unique`, 构造函数以及将其用于函数返回值和容器成员等方面的操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值