操作内存
创建内存:new
过程:用new创建内存,如果成功的话那么直接分配,然后调用对象的构造函数,如果分配不够,那么先去调用用户自己写的set_new_handler函数,一般这个函数是用来释放些内存,然后使多点内存,然后再去申请,如果还是不行,再调用该函数,但是一般就是用个标记变量释放第一次,第二次直接退出,然后会返回一个bad_alloc错误
释放内存:delete
过程:调用析构函数,然后释放内存,如果释放一个数组,那么就是找到数组前几个字节,一般有个保存长度的东西
智能指针
原因:因为动态内存在用指针使用上,如果忘记释放,那么很容易造成内存泄漏,所以推出了智能指针,智能指针也就是一个利用了rall资源管理机制,就是利用把当前变量转换成对象,利用析构函数来释放内存
shared_ptr<>:首先我们要清楚的是这是一个对象,也就是包括了构造 析构 赋值 等的一个东西,这个话是一个能允许多个指针来操作的一个指针
核心概念:类里面包含一个计数器,一个指针,通过拷贝构造,赋值 来使当前计数器加一,如果释放计数器减一,计数器为0才使用delete,改变指向的时候,就要先把老对象计数器减一,然后再去改变指向再计数器加一
初始化:开始利用构造函数进行初始化,如果在外面的话就需要使用make_shared<T>(x)来把当前给转化成智能指针对象
unique_ptr<int> :也就是只能一个指针指向对象,所以就需要把拷贝构造和赋值操作都给禁用掉
主要问题:
u.release 不能直接普通的调用,这个只是放弃控制权而已,但是这个又是只有一个指针指向,如果不把返回值给其他对象那么就会找出内存泄漏
正确操作 u1.reset(u2.release)
原文地址:https://www.cnblogs.com/Lis-/p/12639364.html