智能指针unique_ptr一些用法
(1)临时右值赋值
unique_ptr赋值给另一个是,如果unique_ptr是一个临时右值,编译器允许这样做;如果unique_ptr将存在一段时间,编译器禁止这样做。
unique_ptr<My_name>p0;
p0 = unique_ptr<My_name>(new My_name("艾斯卡诺"));
(2)release()释放unique_ptr对指针的控制权,将unique_ptr置为空,返回裸指针。nullptr可以释放unique_ptr控制对象。
(3)std::move可以转移对指针的控制权。(将unique_ptr传递给子函数,在子函数中释放对象)
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class My_name
{
public:
string m_name;
My_name() {cout<<m_name<<"调用构造函数My_name()\n";}
My_name(const string & name):m_name(name) {cout<<"调用构造函数My_name("<<m_name<<")\n";}
~My_name() {cout<<"调用析构函数~My_name("<<m_name<<")\n";}
}
//函数 module1需要一个指针,但不释放资源
void module1(const My_name* a){
cout<<a->m_name<<endl;
}
//函数 module2需要一个指针,释放资源
void module2(const My_name* a){
cout<<a->m_name<<endl;
delete a;
}
//函数 module3需要一个指针,但不释放资源
void module3(const unique_ptr<My_name>&a){
cout<<a->m_name<<endl;
}
//函数 module4需要一个指针,释放资源
void module4(unique_ptr<My_name> a){
cout<<a->m_name<<endl;
}
int main()
{
My_name* P = new My_name("艾斯卡诺");
cout<<"开始调用函数。\n";
module1(pu.get()); //把原始指针给module1方法用一下
module2(pu.release());//把原始指针交给module2函数,失去原始指针控制权后,pu成空指针。
module3(pu);
module4(move(pu));//把对原始指针的控制权交给module4的形参
cout<"m_name="<<(*pu1).m_name<<endl;
cout<"m_name="<<pu1->m_name<<endl;
}
(4)reset()释放对象
void reset(T* _ptr=(T*)nullptr));
pp.reset();//释放pp对象指向的资源对象
pp.reset(nullptr);//释放pp对象指向的资源对象
pp.reset(new AA("bbb");//释放pp对象指向的资源对象
(5)swap()交换两个unique_ptr的控制权
void swap(unique_ptr<T>&Right);
(6)unique_ptr和普通指针一样,当指向一个类的基类对象时,也具有多态的性质,如同使用裸指针管理基类对象和派生类对象一样。
(7)unique_ptr并不是绝对安全,当用exit()函数退出时,全局的unique_ptr对象可以释放,局部的unique_ptr对象无法释放。
(8)unique_ptr提供了支持数组的具体化版本
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class My_name
{
public:
string m_name;
My_name() {cout<<m_name<<"调用构造函数My_name()\n";}
My_name(const string & name):m_name(name) {cout<<"调用构造函数My_name("<<m_name<<")\n";}
~My_name() {cout<<"调用析构函数~My_name("<<m_name<<")\n";}
}
int main()
{
//普通指针数组
My_name*parr1= new My_name[2];
//初始化
// My_name*parr1= new My_name[2]{string("梅利奥达斯"),string("艾斯卡诺"),string("班")};
parr1[0].m_name = "梅利奥达斯";
cout<<"parr1[0].m_name="<<parr1[0].m_name<<endl;
parr1[1].m_name = "艾斯卡诺";
cout<<"parr1[1].m_name="<<parr1[1].m_name<<endl;
//智能指针数组
unique_ptr<My_name[]>parr2(new My_name[2]);
unique_ptr<My_name[]>parr2(new My_name[2]){string("梅利奥达斯"),string("艾斯卡诺"),string("班")};
parr2[0].m_name = "梅利奥达斯";
cout<<"parr2[0].m_name="<<parr1[0].m_name<<endl;
parr2[1].m_name = "艾斯卡诺";
cout<<"parr2[1].m_name="<<parr1[1].m_name<<endl;
}