C++的三类智能指针,shared_ptr, weak_ptr, unique_ptr
第一类:shared_ptr;
#include#include using namespace std; class MM { public: MM(string name,int age):name(name),age(age){} string& getname() { return name; } int& getage() { return age; } private: string name; int age; }; class TestData { public: TestData() { cout << "构造函数!n"; } ~TestData() { cout << "析构函数!n"; } }; //文件指针删除器 void closeFile(FILE* file) { cout << "文件指针释放成功!n"; fclose(file); } int main() { shared_ptr ptr; if (!ptr) { cout << "智能指针为空!n"; } //2。构造函数传参的绑定一个堆区变量。 shared_ptr Ptr(new int(100)); cout << *Ptr << endl; shared_ptr tmp(new MM("江涛", 20)); cout << tmp->getname() << tmp->getage(); //3.make_shared来构建,这个函数的参数由构造函数的参数决定, shared_ptr pMake=make_shared (1); shared_ptr pMm=make_shared ("MM",18); //4.shared_ptr主要成员函数 { shared_ptr pmm(new MM("MM", 18)); //可以直接把对象当成指针来用 pmm->getname(); (*pmm).getname(); cout << "智能指针管理对象的地址:" << pmm.get() << endl; cout< getname()<<' '< getage()< pmm2(pmm); cout << "count:" << pmm.use_count() << endl; cout << "count:" << pmm2.use_count() << endl; shared_ptr pmm3 = pmm; cout << "count:" << pmm.use_count() << endl; cout << "count:" << pmm3.use_count() << endl; shared_ptr pmm4; pmm4 = pmm; cout << "count:" << pmm.use_count() << endl; cout << "count:" << pmm4.use_count() << endl; pmm4.reset(); //断开与管理对象联系 cout << "count:" << pmm.use_count() << endl; pmm3.reset(new MM("慧姐", 19)); cout << "count:" << pmm.use_count() << endl; } //注意:智能指针管理能够直接delete内存变量,如果要经过特殊方式释放内存,那么需要自己手动写删除器。 //1.对象数组 { cout << "对象数组:n"; // shared_ptr p(new TestData[10]);//直接这样会报错,因为智能指针只能析构一次,这里需要析构十次 shared_ptr pp(new TestData[10], [](TestData* pp) {delete[] pp; }); } //2.文件指针 { shared_ptr pf(fopen("1.txt","w+"), closeFile); } return 0; }
第二类:weak_ptr
* weak_ptr只能从shared_ptr或者weak_ptr构造而来 3.主要用途是为了解决shared_ptr循环引用导致的内存未被释放问题 注意点: 不可以使用*或者->访问对象 weak_ptr不会造成计数的改变*/ #include#include #include using namespace std; class B; class A { public: A() { cout << "A" << endl; } ~A() { cout << "~A" << endl; } //protected: //shared_ptrb; //会引发循环 weak_ptrb;//这样就不会 }; class B { public: B() { cout << "B" << endl; } ~B() { cout << "~B" << endl; } //protected: //shared_ptra; //会引发循环 weak_ptra;//这样就不会 }; int main() { //weak_ptr pInt(new int(100));错误 { shared_ptr pShare(new int(100)); cout << "count:" << pShare.use_count() << endl; weak_ptr pWeak(pShare); cout << "count:" << pWeak.use_count() << endl; weak_ptr pWeak2(pShare); cout << "count:" << pWeak2.use_count() << endl; pWeak2.reset(); cout << "count:" << pWeak2.use_count() << endl; shared_ptr temp = pWeak.lock(); cout << *temp.get() << endl; } cout << "循环引用问题:" << endl; { shared_ptraObject = make_shared(); shared_ptrbObject = make_shared(); cout << aObject.use_count() << endl; cout << bObject.use_count() << endl; aObject->b = bObject; bObject->a = aObject; cout << aObject.use_count() << endl; cout << bObject.use_count() << endl; } return 0; }
第三类:unique_ptr
#includeusing namespace std; class MM { public: MM(int Num) :Num(Num) { cout << "MM成功!n"; } int getNum() { return Num; } private: int Num; }; int main() { //1.注意不能使用拷贝构造和拷贝赋值 unique_ptr pMM(new int(100)); //2.1采用move语句转交所有权 unique_ptr ptr(move(pMM)); cout << "value:" << *ptr; cout << "value:" << pMM.get()< ptr2; ptr2 = move(ptr); cout << "value:" << *ptr2 << endl; cout << "value:" << ptr.get() << endl; //采用2.2reset结合release函数的方式转交所有权 unique_ptr pData(new MM(10086)); cout << pData->getNum()< pData2; pData2.reset(pData.release());//转交所有权 cout << pData2->getNum()< getNum() << endl; return 0; }



