智能指针
STL中的智能指针auto_ptr
头文件: <memory>
auto_ptr<int> ap1(new int(1)); //初始化正确,创建ap1类模板对象,使类模板里的指针为int*型,并指向1的地址
int* p = new int(1);
auto_ptr<int> ap2(p); //初始化正确
// auto_ptr<int> ap3 = new int(2); //出错,不能隐式初始化
auto_ptr<int> ap(new int(1));
cout<< ap.get()<<endl; //打印数值1的地址 : 0x6d2d18
int *p =ap.get();
cout<< *p<<endl; //打印数值1
auto_ptr<int> p1(new int(1));
auto_ptr<int> p2(new int(2));
p1 =p2; //首先会delete p1对象的类成员指针,然后将p2对象的类成员指针赋值给p1, 最后修改p2指针地址为NULL
cout<<"p2 ="<<p2.get()<<endl; //打印 : p2=0
//cout<<*p2<<endl; //出错,因为p2=0
初探auto_ptr智能指针
#include <iostream>
#include <memory>
using namespace std;
class Test
{
public:
int mvalue;
Test(int i=0)
{
mvalue=i;
cout<< "Test("<<mvalue<<")"<<endl;
}
~Test()
{
cout<< "~Test("<<mvalue<<")"<<endl;
}
};
void func() //在func函数里使用auto_ptr
{
auto_ptr<Test> p1(new Test(1));
cout<<"p1 ="<<p1.get()<<endl;
cout<<endl;
auto_ptr<Test> p2(new Test(2));
cout<<"p2 ="<<p2.get()<<endl;
cout<<endl;
cout<<"p1=p2"<<endl;
p1=p2;
cout<<endl;
cout<<"p1 ="<<p1.get()<<endl;
cout<<"p2 ="<<p2.get()<<endl;
}
int main()
{
cout<<"*****begin*****"<<endl;
func();
cout<<"*****end*****"<<endl;
return 0;
}
运行打印:
*****begin*****
Test(1)
p1 =0x8db1008
Test(2)
p2 =0x8db1018
p1=p2
~Test(1)
p1 =0x8db1018
p2 =0
~Test(2)
*****end*****
从结果可以看到,由于func()的生命周期结束,所以里面的auto_ptr指针自动就被释放了。
可以发现在调用p1=p2时, 首先会delete p1对象的类成员指针(调用~Test(1)析构函数),然后将p2对象的类成员指针赋值给p1(p1=0x8db1018), 最后修改p2指针地址为NULL(p2 =0)。
STL中的智能指针shared_ptr(需要C++11支持)
shared_ptr<int> p1(new int(1));
shared_ptr<int> p2(new int(2));
p1.swap(p2); //交换后 p1=2,p2=1
cout<< *p1 <<endl; //打印 2
cout<< *p2 <<endl; //打印 1
shared_ptr<int> sp1(new int(30)); //计数+1
cout<<sp1.use_count()<<endl; //打印计数:1
cout<<sp1.unique()<<endl; //打印:1
shared_ptr<int> sp2(sp1); //计数+1
cout<<sp1.use_count()<<endl; //打印:2
cout<<sp1.unique()<<endl; //由于sp1指针对象被sp2引用,打印:0
sp1.reset(); //将sp1指针对象地址设为NULL,计数-1
cout<<sp1.get()<<endl; //sp1指针对象地址为NULL,打印:0
cout<<sp2.use_count()<<endl; //打印:1
cout<<sp2.unique()<<endl; //由于sp1释放,仅剩下sp2指向30所在的地址,所以打印:1
初探shared_ptr智能指针(以上个Test类为例分析)
#include <iostream>
#include <memory>
using namespace std;
class Test
{
public:
int mvalue;
Test(int i=0)
{
mvalue=i;
cout<< "Test("<<mvalue<<")"<<endl;
}
~Test()
{
cout<< "~Test("<<mvalue<<")"<<endl;
}
};
int main()
{
cout<<"*****begin*****"<<endl;
shared_ptr<Test> p1(new Test(1));
shared_ptr<Test> p2(p1);
cout<<"*p1="<< p1->mvalue<<","<<"*p2="<<p2->mvalue<<endl;
p1.reset();
p2.reset();
cout<<"count:"<<p2.use_count()<<endl;
cout<<"*****end*****"<<endl;
return 0;
}
运行打印:
*****begin*****
Test(1)
*p1=1, *p2=1
~Test(1)
count:0
*****end*****
从结果可以看到,我们把p1和p2都释放了后,由于count=0,便自动去delete Test指针了.
STL中的其它智能指针(在后面学习到,再来深入描述)
-weak_ptr
-unique_ptr
QT中的智能指针(在后面学习到,再来深入描述)
-QPointer
头文件<QPointer>
-QSharedPointer
头文件<QSharedPointer>