智能指针 shared_ptr 使用
#include <memory>#include <iostream>#include <vector>using namespace std;class Test{public: Test(int d = 0):data(d){cout << "cr:" << data << endl;} ~Test(){cout << "fr:" << data << endl;} void fun(){ cout << "Test func(" << data << ")" << endl; }private: int data;};int main(){ //shared_ptr<Test> sp = make_shared<Test>(); Test* pt = new Test(); shared_ptr<Test> sp(pt); if(sp){ cout << "sp指向了对象" << endl; } (*sp).fun(); shared_ptr<int> isp; if(!isp){ cout << "isp没有指向对象" << endl; } Test* tmp1 = sp.get(); auto sp1 = make_shared<Test>(10); Test* tmp2 = sp1.get(); swap(sp, sp1); tmp1->fun();//0 tmp2->fun();//10 //sp和sp1所指向的对象被交换了 sp.get()->fun();//10 sp1.get()->fun();//0}
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Test{
public:
Test(int d = 0):data(d){cout << "cr:" << data << endl;}
~Test(){cout << "fr:" << data << endl;}
void fun(){
cout << "Test func(" << data << ")" << endl;
}
private:
int data;
};
int main(){
//shared_ptr<Test> sp = make_shared<Test>();
Test* pt = new Test();
shared_ptr<Test> sp(pt);
if(sp){
cout << "sp指向了对象" << endl;
(*sp).fun();
shared_ptr<int> isp;
if(!isp){
cout << "isp没有指向对象" << endl;
Test* tmp1 = sp.get();
auto sp1 = make_shared<Test>(10);
Test* tmp2 = sp1.get();
swap(sp, sp1);
tmp1->fun();//0
tmp2->fun();//10
//sp和sp1所指向的对象被交换了
sp.get()->fun();//10
sp1.get()->fun();//0
shared_ptr<Test> tsp = make_shared<Test>(11); cout << tsp.use_count() << endl;//1 //tsp1和tsp指向相同的对象,这个对象的计数器加1 shared_ptr<Test> tsp1(tsp); cout << tsp.use_count() << endl;//2 //用tsp1改变了对象的data的值,所以用tsp再访问这个对象,发现对象被改变了 tsp1->setData(111); tsp->fun();//111 shared_ptr<Test> q(new Test(20)); cout << q.use_count() << endl;//1 cout << tsp.use_count() << endl;//2 //如果q不是智能指针,q指向的Test(20)这块内存就泄露了 //q是智能指针,所以自动释放了Test(20)这块内存 q = tsp; cout << q.use_count() << endl;//3 cout << tsp.use_count() << endl;//3 if(!q.unique()){ cout << "不是只有一个智能指针指向了某个对象" << endl; }
shared_ptr<Test> tsp = make_shared<Test>(11);
cout << tsp.use_count() << endl;//1
//tsp1和tsp指向相同的对象,这个对象的计数器加1
shared_ptr<Test> tsp1(tsp);
cout << tsp.use_count() << endl;//2
//用tsp1改变了对象的data的值,所以用tsp再访问这个对象,发现对象被改变了
tsp1->setData(111);
tsp->fun();//111
shared_ptr<Test> q(new Test(20));
cout << q.use_count() << endl;//1
//如果q不是智能指针,q指向的Test(20)这块内存就泄露了
//q是智能指针,所以自动释放了Test(20)这块内存
q = tsp;
cout << q.use_count() << endl;//3
cout << tsp.use_count() << endl;//3
if(!q.unique()){
cout << "不是只有一个智能指针指向了某个对象" << endl;
shared_ptr<Test> hun(int d){ return make_shared<Test>(d);}void use_hun1(int d){ shared_ptr<Test> p = hun(d); p->fun();}//p离开作用域后,它指向的内存会被自动释放 shared_ptr<Test> use_hun2(int d){ shared_ptr<Test> p = hun(d);//计数器为1 return p;//返回p时,计数器递增,为2 }//离开作用域后,计数器递减,为1,因为不为0,所以不会释放
shared_ptr<Test> hun(int d){
return make_shared<Test>(d);
void use_hun1(int d){
shared_ptr<Test> p = hun(d);
p->fun();
}//p离开作用域后,它指向的内存会被自动释放
shared_ptr<Test> use_hun2(int d){
shared_ptr<Test> p = hun(d);//计数器为1
return p;//返回p时,计数器递增,为2
}//离开作用域后,计数器递减,为1,因为不为0,所以不会释放
一到四的小例子:
include <memory>#include <iostream>#include <vector>using namespace std;class Test{public: Test(int d = 0):data(d){cout << "cr:" << data << endl;} ~Test(){cout << "fr:" << data << endl;} void fun(){ cout << "Test func(" << data << ")" << endl; } void setData(int d){ data = d; }private: int data;};//test3 智能指针作为函数的返回值 shared_ptr<Test> hun(int d){ return make_shared<Test>(d);}void use_hun1(int d){ shared_ptr<Test> p = hun(d); p->fun();}//p离开作用域后,它指向的内存会被自动释放 shared_ptr<Test> use_hun2(int d){ shared_ptr<Test> p = hun(d);//计数器为1 return p;//返回p时,计数器递增,为2 }//离开作用域后,计数器递减,为1,因为不为0,所以不会释放 int main(){ //test1 shared_ptr和unique_ptr都支持的操作 /* //shared_ptr<Test> sp = make_shared<Test>(); Test* pt = new Test(); shared_ptr<Test> sp(pt); if(sp){ cout << "sp指向了对象" << endl; } (*sp).fun(); shared_ptr<int> isp; if(!isp){ cout << "isp没有指向对象" << endl; } Test* tmp1 = sp.get(); auto sp1 = make_shared<Test>(10); Test* tmp2 = sp1.get(); swap(sp, sp1); tmp1->fun(); tmp2->fun(); sp.get()->fun(); sp1.get()->fun(); */ //test2 shared_ptr独有的操作 /* shared_ptr<Test> tsp = make_shared<Test>(11); cout << tsp.use_count() << endl;//1 //tsp1和tsp指向相同的对象,这个对象的计数器加1 shared_ptr<Test> tsp1(tsp); cout << tsp.use_count() << endl;//2 //用tsp1改变了对象的data的值,所以用tsp再访问这个对象,发现对象被改变了 tsp1->setData(111); tsp->fun();//111 shared_ptr<Test> q(new Test(20)); cout << q.use_count() << endl;//1 cout << tsp.use_count() << endl;//2 //如果q不是智能指针,q指向的Test(20)这块内存就泄露了 //q是智能指针,所以自动释放了Test(20)这块内存 q = tsp; cout << q.use_count() << endl;//3 cout << tsp.use_count() << endl;//3 if(!q.unique()){ cout << "不是只有一个智能指针指向了某个对象" << endl; } */ //test3 智能指针作为函数的返回值 /* auto ap = use_hun2(22); ap->fun(); use_hun1(33); */}
include <memory>
void setData(int d){
data = d;
//test3 智能指针作为函数的返回值
//test1 shared_ptr和unique_ptr都支持的操作
/*
tmp1->fun();
tmp2->fun();
sp.get()->fun();
sp1.get()->fun();
*/
//test2 shared_ptr独有的操作
auto ap = use_hun2(22);
ap->fun();
use_hun1(33);
github完整代码
include <iostream>#include <memory>#include <vector>#include <string>using namespace std;class shared_vector{public: typedef vector<string>::size_type size_type; shared_vector():data(make_shared<vector<string>>()){} shared_vector(initializer_list<string> il): data(make_shared<vector<string>>(il)){} size_type size()const{return data->size();} bool empty()const{return data->empty();} //尾部插入,删除元素 void push_back(const string& s){data->push_back(s);} void pop_back(){data->pop_back();} //访问元素 string& front(){return data->front();} string& back(){return data->back();}private: shared_ptr<vector<string>> data;};class un_shared_vector{public: typedef vector<string>::size_type size_type; un_shared_vector():data(vector<string>()){} un_shared_vector(initializer_list<string> il):data(il){} size_type size()const{return data.size();} bool empty()const{return data.empty();} //尾部插入,删除元素 void push_back(const string& s){data.push_back(s);} void pop_back(){data.pop_back();} //访问元素 string& front(){return data.front();} string& back(){return data.back();}private: vector<string> data;};int main(){ shared_vector sv{"aa","bb"}; shared_vector sv1(sv); //因为sv和sv1共享同一个vector, //所以通过sv改变vector后,通过sv1也发现了相同的改变 sv.push_back("cc"); cout << sv1.back() << endl; un_shared_vector usv{"11","22"}; un_shared_vector usv1(usv); //因为usv和usv1不共享同一个vector, //所以通过usv改变vector后,usv1里面的vector没有跟着变化 usv.push_back("33"); cout << usv1.back() << endl; cout << usv.back() << endl;}
include <iostream>
#include <string>
class shared_vector{
typedef vector<string>::size_type size_type;
shared_vector():data(make_shared<vector<string>>()){}
shared_vector(initializer_list<string> il):
data(make_shared<vector<string>>(il)){}
size_type size()const{return data->size();}
bool empty()const{return data->empty();}
//尾部插入,删除元素
void push_back(const string& s){data->push_back(s);}
void pop_back(){data->pop_back();}
//访问元素
string& front(){return data->front();}
string& back(){return data->back();}
shared_ptr<vector<string>> data;
class un_shared_vector{
un_shared_vector():data(vector<string>()){}
un_shared_vector(initializer_list<string> il):data(il){}
size_type size()const{return data.size();}
bool empty()const{return data.empty();}
void push_back(const string& s){data.push_back(s);}
void pop_back(){data.pop_back();}
string& front(){return data.front();}
string& back(){return data.back();}
vector<string> data;
shared_vector sv{"aa","bb"};
shared_vector sv1(sv);
//因为sv和sv1共享同一个vector,
//所以通过sv改变vector后,通过sv1也发现了相同的改变
sv.push_back("cc");
cout << sv1.back() << endl;
un_shared_vector usv{"11","22"};
un_shared_vector usv1(usv);
//因为usv和usv1不共享同一个vector,
//所以通过usv改变vector后,usv1里面的vector没有跟着变化
usv.push_back("33");
cout << usv1.back() << endl;
cout << usv.back() << endl;
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728