智能指针unique_ptr(C++11)

智能指针unique_ptr(C++11)

1、unique_ptr 特性

1、基于排他所有权模式:两个指针不能指向同一个资源

2、无法进行左值 unique_ptr 复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造和赋值,使用std::move(XX)

3、 保存指向某个对象的指针,当它本身离开作用域时会自动释放它指向的对象。

4、在容器中保存指针是安全的

#include <stdio.h>
#include <iostream>
#include <string>
#include <memory>
#include <vector>
using namespace std;
int main() {
//弊端 1. auto_ptr 被 C++11 抛弃的主要理由 p1= p2 ,复制或赋值都会改变资源的所有权
//unique_ptr 如何解决这个问题? 不允许显示的右值赋值和构造
	unique_ptr<string> p1(new string("I 'm martin."));
	unique_ptr<string> p2(new string("I 'm rock."));
	printf("p1: %p\n", p1.get());
	printf("p2: %p\n", p2.get());
    
//如果一定要转移,使用 move 把左值转成右值
	p1 = std::move(p2);
	printf("p1: %p\n", p1.get());
	printf("p2: %p\n", p2.get());
    
//p1 = p2; //左值赋值禁止
	unique_ptr<string> p3(new string("I 'm p3."));
	unique_ptr<string> p4(std::move(p3)); //左值拷贝构造也不行,必须转成右值
    
//弊端 2. 在 STL 容器中使用 auto_ptr 存在重大风险,因为容器内的元素必需支持可复制(copyconstructable)和可赋值(assignable)。
	vector<unique_ptr<string>> vu;
	unique_ptr<string> p5(new string("I 'm p5."));
	unique_ptr<string> p6(new string("I 'm p6."));
	vu.push_back(std::move(p3));
	vu.push_back(std::move(p4));
	cout << "va[0]: " << *vu[0] << endl;
	cout << "va[1]: " << *vu[1] << endl;
    
	//vu[0] = vu[1]; //unique_ptr 不支持直接赋值,没有风险
	//弊端 3. auto_ptr 不支持对象数组的内存管理,unique_ptr 支持
	//但是 unique_ptr 支持对象数组的管理
	//auto_ptr<int[]> ai(new int[5]); //不能这样定义
	unique_ptr<int[]> ui(new int[5]); //自动会调用 delete []函数去释放
	system("pause");
	return 0;
}

2、 构造函数

unique_ptr<T> up ; //空的 unique_ptr,可以指向类型为 T 的对象
unique_ptr<T> up1(new T()) ;//定义 unique_ptr,同时指向类型为 T 的对象
unique_ptr<T[]> up ; //空的 unique_ptr,可以指向类型为 T[的数组对象
unique_ptr<T[]> up1(new T[]) ;//定义 unique_ptr,同时指向类型为 T 的数组对象
unique_ptr<T,D> up(); //空的 unique_ptr,接受一个 D 类型的删除器 d,使用 d 释放内存
unique_ptr<T,D> up(new T()); //定义 unique_ptr,同时指向类型为 T 的对象,接受一个 D类型的删除器 d,使用删除器 d 来释放内存

3、赋值

unique_ptr<int> up1(new int(10));
unique_ptr<int> up2(new int(11));
up1 = std::move(up2);//必须使用移动语义,结果,up1 内存释放, up2 交由 up1 管理

4、主动释放对象

up = nullptr ;//释放 up 指向的对象,将 up 置为空
或 up = NULL; //作用相同

5、放弃对象控制权

up.release(); //放弃对象的控制权,返回指针,将 up 置为空,不会释放内存

6、重置

up.reset(…) ; //参数可以为 空、内置指针,先将 up 所指对象释放,然后重置 up 的值

7、交换

up.swap(up1); //将智能指针 up 和 up1 管控的对象进行交换
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值