当前位置: 首页 > article >正文

C++智能指针unique_ptr

智能指针的设计思路

智能指针是类模板,在栈上创建智能指针对象。把普通指针交给智能指针对象。当智能指针对象过期时,调用析构函数释放普通指针的内存。

有unique_ptr,shared_ptr和weak_ptg三种智能指针

unique_ptr

unique_ptr独享它指向的对象,同一时间只有一个unique_ptr指向同一个对象。当unique_ptr被销毁时,指向的对象有也随即被销毁。

#include<memory>

/*
T表示指针指向的数据类型;
第二个模板参数指定删除器,缺省用delete释放资源;
*/
template <typename T, typename D=default_delete<T>>
class unique_ptr
{
public:
	explicit unique_ptr(poniter p) noexcept;//不可用于转换函数
	unique_ptr(const unique_ptr&) = delete;//禁用拷贝构造函数
	T& operator*() const;                  //重载了*操作符
	T* operator->() const noexcept;			//重载了->运算符


private:
	poniter p;
};

unique_ptr的更多技巧:

1.如果源unique_ptr是一个临时右值,允许赋值;

std::unique_ptr<A> func()
{
	std::unique_ptr<A> pp(new A("民权"));
	return pp;
}
//*如果unique_ptr是一个临时右值,允许使用=赋值*/
std::unique_ptr<A> ptr5 = std::unique_ptr<A>(new A(""));
std::unique_ptr<A> ptr5 = func();

2.用nullptr给unique_ptr赋值将释放对象

3.release()释放对指针的控制权,将unique_ptr置为空,返回裸指针。

4.std::move可以转移对指针的控制权

	
void fun1(const A* p)
{}
void fun2(A* p)
{}
void fun3(const std::unique_ptr<A>& a)
{}
void fun4(std::unique_ptr<A> a)
{}

//四种使用场景
	//fun1()需要一个指针,但不对这个指针负责
	fun1(pPtr.get());
	//fun2需要一个指针,对这个指针负责
	fun2(pPtr.release());
	//fun3需要一个unque_ptr,不对这个unique_ptr负责
	fun3(pPtr);
	//fun4需要一个unqie_ptr,对这个unique_ptr负责
	fun4(std::move(pPtr));

5.reset释放对象

p.reset();//释放p指向的对象

p.reset(nullptr);//释放p指向的对象

p.reset(new A(""));//释放p指向的资源对象,同时指向新的对象

6.unique_ptr可以像普通指针那样,当指向一个类继承体系的基类对象时,也具有多态性质,如果使用裸指针基类对象和派生类对象那样

8.unique_ptr不是绝对安全,如果程序中调用了exit退出,全局的unique_ptr可以自动释放,但局部的unique_ptr无法释放

9.unique_ptr提供了供数组的具体化版本

	std::unique_ptr<int[]> parr(new int[3]{33,344,76});
	std::cout << parr[0] << std::endl;
	std::cout << parr[1] << std::endl;
	std::cout << parr[2] << std::endl;

	std::unique_ptr<A[]> parr1(new A[3]{ "","","" });
	std::cout << parr1[0].m_name << std::endl;
	std::cout << parr1[1].m_name << std::endl;
	std::cout << parr1[2].m_name << std::endl;


http://www.kler.cn/a/14401.html

相关文章:

  • tp6 php 用chatgpt写的防爬技术
  • 高效办公——Excel表格-03篇(Excel常用快捷键 以及 Excel快捷键结合公式的各种常见的办公例子)
  • webwork详细攻略,在vue中使用和加载静态文件
  • 加强人工智能共性技术研发与产业化协同发展
  • Java项目上线之云服务器环境篇(三)——MySQL的安装与配置
  • 软件测试概念篇(下)|开发模型与测试模型
  • 偏好强化学习概述
  • ajax写法和json的知识点
  • Redis高可用高性能缓存的应用系列06 - 热Key,大Key,并发竞争解决方案
  • Java_常用API
  • GNU make的官方生成依赖例子理解
  • 有手就行——基础XGBoost实战以 iris 数据集为例
  • 并发计算公式
  • 计及调度经济性的光热电站储热容量配置方法【IEEE30节点】(Matlab代码实现)
  • backward()和zero_grad()在PyTorch中代表什么意思
  • 机器学习在生态、环境经济学中的实践技术应用及论文写作
  • Python 读写 CSV 数据
  • Shiro详解(超全面)
  • 备份数据看这里,免费教你苹果手机怎么备份所有数据!
  • js常用方法