C++中早期使用的智能指针是auto_ptr,在早些时候它的应用比较方便,但随着发展与要求的变化导致auto_ptr不能够很好的满足需求,于是目前auto_ptr已经被弃用了
何为智能指针?
我们在平常进行new空间之后,总是会忘掉delete释放空间,或是因为指针还在使用空间时就被释放而导致的指针对内存的非法访问,而智能指针要做的就是自动释放对象所占有的空间,调用析构函数来对new出来的空间进行delete释放。
auto_ptr特性:
1)不允许隐式构造;
隐士构造:eg:int*p1=new int(10);
auto_ptr<int>p2=p1; //error,不允许隐式构造
auto_ptr<int>p2=(auto_ptr<int>)p1;//显式转后方可
2)允许拷贝构造;
3)允许赋值运算符;
4)不能让多个智能指针指向同一个空间
常用的智能指针:
unique_ptr,shared_ptr,weak_ptr三种智能指针
常用的函数方法:
1)get():获取当前智能指针;
eg:auto_ptr<int>p(new int(1));
int *tmp = p.get(); cout<<*tmp<<endl;
2) release():转移资源,返回值是指针对象
eg:auto_ptr<int>p(new int(1));
int *tmp = p.release(); //将p的资源转移给tmp后,将自身置空。
cout<<*tmp<<endl;
3) reset():重置智能指针
eg:auto_ptr<int>p(new int(1));
auto_ptr<int>p2(new int(2));
p2.reset(p); //将自身资源释放,重新指向p资源
唯一性智能指针(unique_ptr):
由于唯一性智能指针允许隐式构造,不允许拷贝构造(可以使用右值引用来达到拷贝构
造),不允许赋值运算
符,也不允许多个唯一指针指向同一个空间;
所以在声明唯一性智能指针的时候就要对其进行显式的初始化;
eg:int * p =new int(1);
unique_ptr< int >p2(p); //显式初始化
如果没有初始化也没有关系,可以调用reset()函数对其进行初始化。
eg:int * p = new int(1);
unique_ptr< int > p2;
p2.reset( p);
unique_ptr<int>p3;
p3 = move(p2); //产生临时指针对象隐式构造p2;
unique_ptr智能指针特性
最新推荐文章于 2022-12-12 22:39:18 发布
本文介绍了C++中的智能指针,包括auto_ptr的特性和弃用原因,以及现代C++中常用的unique_ptr和shared_ptr。智能指针主要目的是自动管理内存,防止内存泄漏。unique_ptr具有唯一性,不允许拷贝和赋值,而shared_ptr允许多个智能指针共享同一资源。文章还展示了get(), release()和reset()等关键函数的使用方法。
摘要由CSDN通过智能技术生成