




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
boost常用庫使用介紹第二講第一頁,共41頁。第一節(jié):C++程序員對內(nèi)存管理的苦惱1、內(nèi)存泄漏(memoryleak)2、野指針(wildpointer)3、訪問越界(accessviolation)boost的智能指針庫就是內(nèi)存管理的強(qiáng)勁解決方案通過boost智能指針庫,我們能夠高效的進(jìn)行內(nèi)存管理,解決上述問題,同時徹底讓你忘記棧(stack),堆(heap)等內(nèi)存相關(guān)的術(shù)語,并且還會發(fā)現(xiàn),boost為c++提供的內(nèi)存管理解決方案可能比java和c#等其他語言更好,更高效!2第二頁,共41頁。第二節(jié):智能指針與RAII機(jī)制為了管理內(nèi)存等資源,智能指針采用RAII機(jī)制(ResourceAcquisitionIsInitialization,資源獲取既初始化)1、所有初始化操作移到對象的構(gòu)造函數(shù)中2、所有的釋放操作都放在對象的析構(gòu)函數(shù)里。3、適當(dāng)?shù)漠惓L幚泶a來應(yīng)付對象構(gòu)造期間丟出的異常這種用構(gòu)造函數(shù)申請資源用析構(gòu)函數(shù)釋放資源的做法或者說技術(shù)通常被稱為“資源獲取即初始化”。這樣做的優(yōu)點是而易見的:對象創(chuàng)建后,用戶能開始正確使用對象,不用擔(dān)心對象的有效性或者是否還要作進(jìn)一步的初始化操作。
3第三頁,共41頁。第三節(jié):Boost智能指針的分類:boost提供下列幾種智能指針:4第四頁,共41頁。第四節(jié):shared_ptr簡介1、boost::shared_ptr是一個最像指針的“智能指針”:是boost.smart_ptr中最有價值,最重要,也是最有用的類,boost庫的其他許多類庫都使用了shared_ptr,所以毫無懸念的被收入了c++11標(biāo)準(zhǔn)中去。2、boost::shared_ptr實現(xiàn)了計數(shù)引用:
它包裝了new操作符在堆上分配的動態(tài)對象,但它實現(xiàn)了引用計數(shù),可以自由的拷貝和賦值,在任意地方共享它。當(dāng)引用計數(shù)為0時,它會自動刪除被包裝的動態(tài)分配的對象。5第五頁,共41頁。第四節(jié):shared_ptr簡介3、boost::shared_ptr不需要手動的調(diào)用類似release方法:
它不像侵入式實現(xiàn)的智能指針一樣需要手動的調(diào)用類似release方法,全部用由shared_ptr內(nèi)部的計數(shù)器自動增減,這一點是非常有用的。(COM的IUnknow接口以及boost::intrusive_ptr<T>都是基于侵入式設(shè)計的智能指針,需要手動調(diào)用類似release方法)4、boost::shared_ptr支持所有權(quán)轉(zhuǎn)移:
并且可以安全的存儲在stl標(biāo)準(zhǔn)容器中,是在stl容器存儲指針的標(biāo)準(zhǔn)解法。例如std::vector<int*>IntVec,使用shared_ptr方式為std::vector<boost::shared_ptr<int>>IntptrVec.6第六頁,共41頁。第五節(jié):shared_ptr類摘要1、構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),賦值操作符以及析構(gòu)函數(shù)Template<classT>Classshared_ptr{/*******************構(gòu)造函數(shù)*******************************************/
shared_ptr();//創(chuàng)建一個持有空指針的shared_ptr,use_count()=0&&get()==NULL//獲得一個指向類型T的指針p的管理權(quán),use_count==1&&get()==p,Y類型必須能夠轉(zhuǎn)換為T類型
template<classY>explicitshared_ptr(Y*p);
//作用同上,增加了一個構(gòu)造參數(shù)D,是一個仿函數(shù)對象,代表刪除器,該構(gòu)造函數(shù)非常有用,后面會詳解
template<classY,classD>shared_ptr(Y*p,Dd);/******************拷貝構(gòu)造函數(shù)及賦值操作符重載***********************/
//調(diào)用拷貝構(gòu)造函數(shù)或賦值操作后,引用計數(shù)加1&&get()==r.get()&&use_count()==r.use_count()shared_ptr(shared_ptrconst&r);template<classY>shared_ptr(shared_ptr<Y>const&r);
shared_ptr&operator=(shared_ptrconst&r);template<classY>shared_ptr&operator=(shared_ptr<Y>const&r);/******************析構(gòu)函數(shù)*******************************************/
//引用計數(shù)會減1,如果計數(shù)器為0,get()!=NULL,有刪除器的話會調(diào)用刪除器,否則調(diào)用delete操作符~shared_ptr();}
7第七頁,共41頁。第五節(jié):shared_ptr類摘要2、public成員方法和操作符Template<classT>classshared_ptr{T*get()const;//返回原始指針T&operator*()const;//返回原始指針的引用T*operator->()cosnt;//返回原始指針longuse_count()const;//返回引用計數(shù)boolunique()const;//返回use_count()==1,是否唯一operatorbool()const;//bool值轉(zhuǎn)型,可以用于條件判斷,例如if(ptr){…}voidsb)//交換原始指針
voidreset();template<classY>voidreset(Y*p);template<classY,classD>voidreset(Y*p);}
8第八頁,共41頁。第六節(jié):shared_ptr的一個例子1、#include<boost/shared_ptr.hpp>2、創(chuàng)建一個shared_ptr要用到的簡單類FooclassFoo{private:std::stringm_strName;Public:Foo(conststd::string&strName):m_strName(strName){}~Foo(){std::cout<<“DestructingFoowithname=“<<m_strName<<std::endl}};9第九頁,共41頁。第六節(jié):shared_ptr的一個例子3、實現(xiàn)voidTest_Boost_Shared_Ptr()typedefboost::share_ptr<Foo>FooPtr;voidTest_Boost_Shared_Ptr(){//ptr1獲得Foo__1指針的所有權(quán)FooPtrptr1(newFoo(“Foo1”));//引用計數(shù)為1 assert(ptr1.use_count()==1);//ptr2指向ptr1 FooPtrptr2=ptr1;//調(diào)用shared_ptr的賦值操作符,引用計數(shù)加1 assert(ptr1.use_count()==ptr2.use_count());//兩者引用計數(shù)相同 assert(ptr1==ptr2);//shared_ptr重載==操作符,等同于ptr1.get()==ptr2.get()。 assert(ptr1.use_count()==2);//現(xiàn)在ptr1和ptr2都指向了Foo__1,因此計數(shù)器都為2
10第十頁,共41頁。第六節(jié):shared_ptr的一個例子//ptr3獲得Foo__1指針的所有權(quán)FooPtrptr3=ptr2;//引用計數(shù)加1 assert(ptr1.use_count()==ptr2.use_count()&&ptr1.use_count()==ptr3.use_count()); assert(ptr1.use_count()==3&&ptr2.use_count()==3&&ptr3.use_count()==3); assert(ptr1==ptr2&&ptr1==ptr3);//現(xiàn)在我們重置ptr3,測試reset()函數(shù) ptr3.reset(); assert(ptr3.use_count()==0&&ptr3.get()==NULL); std::cout<<"ptr3引用計數(shù)為0,get()指針指向NULL,但是不會調(diào)用析構(gòu)函數(shù),因為ptr1和ptr2都指向了原生指針"<<std::endl;assert(ptr1.use_count()==ptr2.use_count()&&ptr1.use_count()==2);assert(ptr1==ptr2&&ptr1!=ptr3);//前面ptr1和ptr2都指向了同一個對象,他們的引用計數(shù)都為2,現(xiàn)在創(chuàng)建一個ptr4,讓其指向ptr1。FooPtrptr4=ptr1;//引用計數(shù)加1assert(ptr1==ptr2&&ptr4==ptr1);assert(ptr4.use_count==3&&ptr1.use_count==3&&ptr2.use_count()==3);11第十一頁,共41頁。第六節(jié):shared_ptr的一個例子//現(xiàn)在我們轉(zhuǎn)移ptr2的所有權(quán)到另外一個新分配的名為Foo__2的Foo指針上去//在ptr2轉(zhuǎn)移所有權(quán)后,ptr2的計數(shù)器應(yīng)該是1&&ptr1和ptr4的計數(shù)器為2&&ptr1!=ptr2ptr2.reset(newFoo(“Foo2”);assert(ptr2.use_count()==1&&ptr1.use_count()==2&&ptr4.use_count()==2);assert(ptr1!=ptr2&&ptr1==ptr4);//前面ptr3因為被reset()為0,并且get()=NULL了,我們再用ptr5來指向ptr3,此時ptr5的引用計數(shù)也應(yīng)該//為0而不是加1,并且ptr5.get()返回值應(yīng)該也為NULLFooPtrptr5=ptr3;//引用計數(shù)為0assert(ptr5.use_count()==0&&ptr5.get()==NULL);//運(yùn)行到此時,程序即將結(jié)束,在退出作用域前會調(diào)用析構(gòu)函數(shù)//首先會調(diào)用ptr2的析構(gòu)函數(shù),打印出DestructingaFoowithname=Foo__2//然后會調(diào)用ptr1和ptr4析構(gòu)函數(shù)進(jìn)行引用計數(shù)遞減//最終會打印出DestructingaFoowithname=Foo__1//這樣就沒有任何內(nèi)存泄露了哈哈哈哈}//結(jié)束test_boost_shared_ptr函數(shù)
12第十二頁,共41頁。第七節(jié):shared_ptr使用注意點1、shared_ptr多次引用同一內(nèi)存數(shù)據(jù)導(dǎo)致程序崩潰
例如下面代碼會導(dǎo)致堆內(nèi)存破壞而引起程序奔潰voidtest_boost_shared_ptr_crash(){Foo*pFoo=newFoo("Foo1");boost::shared_ptr<Foo>ptr1(pFoo);boost::shared_ptr<Foo>ptr2(pFoo);}上述代碼兩次釋放同一內(nèi)存而破壞堆,導(dǎo)致程序奔潰。13第十三頁,共41頁。第七節(jié):shared_ptr使用注意點1、shared_ptr多次引用同一內(nèi)存數(shù)據(jù)導(dǎo)致程序崩潰
解決方案: 1)直接使用boost::shared_ptr<int>ptr1(newint(100));使用匿名內(nèi)存分配限制其他shared_ptr多次指向同一內(nèi)存數(shù)據(jù)。多次指向時使用shared_ptr的賦值操作符或拷貝構(gòu)造函數(shù),例如shared_ptr<int>ptr2=ptr1。上面的匿名方式就是資源初始化既分配技術(shù),直接在構(gòu)造函數(shù)中分配內(nèi)存 2)使用boost的make_shared模板函數(shù),例如shared_ptr<int>ptr1=boost::make_shared<int>(100);shared_Ptr<int>ptr2=ptr1;
14第十四頁,共41頁。第七節(jié):shared_ptr使用注意點2、shared_ptr循環(huán)引用導(dǎo)致內(nèi)存泄露,代碼如下:
classParent;classChild;classParent{public:~Parent(){std::cout<<“父類析構(gòu)函數(shù)被調(diào)用\n”;}public:boost::shared_ptr<Child>child_ptr;};15第十五頁,共41頁。第七節(jié):shared_ptr使用注意點2、shared_ptr循環(huán)引用導(dǎo)致內(nèi)存泄露,代碼如下(續(xù)):classChild{public:~Child(){std::cout<<“子類析構(gòu)函數(shù)被調(diào)用\n”;}public:boost::shared_ptr<Parent>Parent_ptr;};
16第十六頁,共41頁。第七節(jié):shared_ptr使用注意點2、shared_ptr循環(huán)引用導(dǎo)致內(nèi)存泄露,代碼如下(續(xù)):
intmain(){
boost::shared_ptr<Parent>father(newParent());//father引用計數(shù)為1
boost::shared_ptr<Child>son(newChild());//son引用計數(shù)為1
//
父子互相引用。
father->children=son;//son的引用計數(shù)為2
son->parent=father;//father的引用計數(shù)為2
return0;//退出作用域前,father和son的引用計數(shù)都減1,此時father和son的引用計數(shù)都是為1//因此各自指向的內(nèi)存無法釋放,導(dǎo)致內(nèi)存泄露}
17第十七頁,共41頁。第七節(jié):shared_ptr使用注意點
2、shared_ptr循環(huán)引用導(dǎo)致內(nèi)存泄露上述代碼運(yùn)行后,不會調(diào)用father和son的析構(gòu)函數(shù),因為循環(huán)引用,導(dǎo)致father和son的引用計數(shù)都為2,退出作用域時候,引用計數(shù)減1,因此father和son在退出作用域時候引用計數(shù)都為1,無法調(diào)用析構(gòu)函數(shù),于是造成father和son所指向的內(nèi)存得不到釋放,導(dǎo)致內(nèi)存泄露。
18第十八頁,共41頁。第七節(jié):shared_ptr使用注意點2、shared_ptr循環(huán)引用導(dǎo)致內(nèi)存泄露的解決方案代碼:
針對循環(huán)引用,使用boost::weak_ptr可以很方便的解決該問題。代碼如下:
classParent;classChild;classParent{public:~Parent(){std::cout<<“父類析構(gòu)函數(shù)被調(diào)用\n”;}public://boost::shared_ptr<Child>child_ptr;改為如下代碼:boost::weak_ptr<Child>child_ptr;};19第十九頁,共41頁。第七節(jié):shared_ptr使用注意點2、shared_ptr循環(huán)引用導(dǎo)致內(nèi)存泄露的解決方案代碼:針對循環(huán)引用,使用boost::weak_ptr可以很方便的解決該問題。代碼如下(續(xù)):classChild{public:~Child(){std::cout<<“子類析構(gòu)函數(shù)被調(diào)用\n”;}public://boost::shared_ptr<Parent>Parent_ptr;改為如下代碼:boost::weak_ptr<Parent>Parent_ptr;};
20第二十頁,共41頁。第八節(jié):Boost::weak_ptr的介紹1、weak_ptr是用來解決循環(huán)引用和自引用對象
從前面的例子我們可以看出,引用計數(shù)是一種很便利的內(nèi)存管理機(jī)制,但是有一個很大的缺點,那就是不能管理循環(huán)引用或自引用對象(例如鏈表或樹節(jié)點),為了解決這個限制,因此weak_ptr被引入到boost的智能指針庫中。2、weak_ptr并不能單獨存在
它是與shared_ptr同時使用的,它更像是shared_ptr的助手而不是智能指針,因為它不具備普通指針的行為,沒有重載operator*和->操作符,這是特意的。這樣它就不能共享指針,不能操作資源,這正是它“弱”的原因。它最大的作用是協(xié)助shared_ptr工作,像旁觀者那樣觀察資源的使用情況。21第二十一頁,共41頁。第八節(jié):Boost::weak_ptr的總結(jié)3、weak_ptr獲得資源的觀察權(quán)
weak_ptr可以從一個shared_ptr或另外一個weak_ptr構(gòu)造,從而獲得資源的觀察權(quán),但weak_ptr并沒有共享資源,它的構(gòu)造并不會引起引用計數(shù)的增加,同時它的析構(gòu)也不會引起引用計數(shù)的減少,它僅僅是觀察者。4、weak_ptr可以被用于標(biāo)準(zhǔn)容器庫中的元素
weak_ptr實現(xiàn)了拷貝構(gòu)造函數(shù)和重載了賦值操作符,因此weak_ptr可以被用于標(biāo)準(zhǔn)容器庫中的元素,例如:在一個樹節(jié)點中聲明子樹節(jié)點std::vector<boost::weak_ptr<Node>>children;22第二十二頁,共41頁。第九節(jié):shared_ptr一些使用技巧:1、將shared_ptr用于標(biāo)準(zhǔn)容器庫有兩種方式:
1)將標(biāo)準(zhǔn)容器庫作為shared_ptr管理的對象 例如boost::shared_ptr<std::vector<T>>,使容器可以被安全的共享,用法與普通shared_ptr沒區(qū)別,我們不再討論。 2)將shared_ptr作為容器的元素 例如std::vector<boost::shared_ptr<T>>,因為shared_ptr支持拷貝構(gòu)造和賦值操作以及比較操作的語意,符合標(biāo)準(zhǔn)容器對元素的要求,所以可以在容器中安全的容納元素的指針而不是拷貝。標(biāo)準(zhǔn)容器可以容納原始指針,例如std::vector<T*>,但是這就喪失了容器的許多好處,因為標(biāo)準(zhǔn)容器庫無法自動管理類型為指針的元素,必須編寫額外的代碼來保證指針最終被正確的刪除,而保存shared_ptr作為標(biāo)準(zhǔn)容器庫的元素,既保證與存儲原始指針幾乎一樣的功能,而且不用擔(dān)心資源泄露。
23第二十三頁,共41頁。第九節(jié):shared_ptr的使用技巧2、以函數(shù)方式封裝現(xiàn)有的c函數(shù)例如crt的FILE操作函數(shù),fopen/fclose/fread等函數(shù),我們可以使用一些技巧,利用shared_ptr進(jìn)行封裝,從而使我們不需要調(diào)用fclose,讓其自動進(jìn)行內(nèi)存管理,代碼如下:1)實現(xiàn)函數(shù)(實際不需要實現(xiàn)該函數(shù),這里實現(xiàn)是為了在資源釋放時候打印出相關(guān)信息):typedefboost::shared_ptr<FILE>;void(FILE*f){fclose(f);std::cout<<“調(diào)用fclose函數(shù)釋放FILE資源\n”;}24第二十四頁,共41頁。第九節(jié):shared_ptr使用技巧2、以函數(shù)方式封裝現(xiàn)有的c函數(shù)2)實現(xiàn)函數(shù)(constchar*path,constchar*mode){//fptr(fopen(path,mode),fclose);//直接使用fclose作為shared_ptr的刪除器fptr(fopen(path,mode),);//使用我們的包裝刪除器,在釋放資源時候打印出相關(guān)信息returnfptr;}25第二十五頁,共41頁。第九節(jié):shared_ptr使用技巧3、用c++橋接設(shè)計模式來封裝現(xiàn)有的c函數(shù),隱藏實現(xiàn)細(xì)節(jié)
在c++的.h文件中聲明如下類:class{private:classimpl;//很重要一點,前向申明實現(xiàn)類,具體實現(xiàn)在.cpp文件中,隱藏實現(xiàn)細(xì)節(jié) boost::shared_ptr<impl>pimpl;//shared_ptr作為私有成員變量public:(charconst*name,charconst*mode);voidRead(void*data,size_tsize);};26第二十六頁,共41頁。第九節(jié):shared_ptr使用技巧:3、用c++橋接設(shè)計模式來封裝現(xiàn)有的c函數(shù)在c++的.cpp文件中實現(xiàn)如下類:class{private:impl(implconst&){}impl&operator=(implconst&){}FILE*f;public:impl(charconst*name,charconst*mode){f=fopen(name,mode);}~impl(){intresult=fclose(f);printf("invoke析構(gòu)函數(shù)result=%d\n",result);}voidread(void*data,size_tsize){fread(data,1,size,f)}};27第二十七頁,共41頁。第九節(jié):shared_ptr使用技巧3、用c++橋接設(shè)計模式來封裝現(xiàn)有的c函數(shù)(constchar*name,constchar*mode):pimpl(new(name,mode)){}void(void*data,size_tsize){pimpl->read(data,size);}voidTest_CPP_(){ ptr(“memory.log”,“r”);//引用計數(shù)為1 ptr2=ptr;//引用計數(shù)為2 chardata[100]; ptr.Read(data,100); printf("%s\n",data);}//析構(gòu)ptr2引用計數(shù)為1,再析構(gòu)ptr,引用計數(shù)為0,釋放內(nèi)存,無泄漏28第二十八頁,共41頁。第九節(jié):shared_ptr使用技巧4、使用面向接口編程方式隱藏實現(xiàn)
在c++的.h文件中聲明如下接口:classIPrinter{public:virtualvoidPrint()=0;protected://受保護(hù)的虛擬析構(gòu)函數(shù),導(dǎo)致本類必須被繼承,也不能調(diào)用delete操作符。virtual~IPrinter(){printf("invokeIPrintervirtual析構(gòu)函數(shù)\n");}};typedefboost::shared_ptr<IPrinter>PrinterPtr;PrinterPtrCreatePrinter();//工廠方法,創(chuàng)建IPrinter智能指針。29第二十九頁,共41頁。第九節(jié):shared_ptr使用技巧4、使用面向接口編程方式隱藏實現(xiàn)在c++的.cpp文件中聲明如下實現(xiàn)類:(很重要一點,實現(xiàn)類都是在cpp文件中的,必須要注意這一點)classPrinter:publicIPrinter{private: FILE*f;public://使用createPrinter時候,調(diào)用實現(xiàn)類的構(gòu)造函數(shù),返回的是IPrinter的shared_ptr Printer(constchar*path,constchar*mode){f=fopen(path,mode); }//實現(xiàn)類的析構(gòu)是public,但是接口類的是protected,但是shared_ptr在析構(gòu)時候會自動調(diào)用實現(xiàn)類的析構(gòu)//且再次調(diào)用基類受保護(hù)的虛擬析構(gòu)函數(shù)。通過這種機(jī)制我們可以完全封閉掉new和delete操作符,只能使用//公開的工廠方法函數(shù)返回接口智能指針,而且不需要也無法調(diào)用析構(gòu)函數(shù),完全由shared_ptr來管理內(nèi)存。//這樣我們在整個程序中都沒有原始指針的概念,從而不會忘記調(diào)用delte操作而導(dǎo)致內(nèi)存泄露。30第三十頁,共41頁。第九節(jié):shared_ptr使用技巧4、使用面向接口編程方式隱藏實現(xiàn) ~Printer(){fclose(f);printf("invokePrinter析構(gòu)函數(shù)result=%d\n",result);} voidPrint(){chardata[100];fread(data,1,100,f);printf("%s\n",data);rewind(f);}};PrinterPtrCreatePrinter(){PrinterPtrptr(newPrinter("memory.log","r");returnptr};
31第三十一頁,共41頁。第九節(jié):shared_ptr使用技巧5、使用shared_ptr持有一個具有侵入式的引用計數(shù)的對象如Com對象或intrusive_ptr等需要手動增減引用計數(shù)的對象。假設(shè)我們要將shared_ptr用于一個COM對象。1)我們在頭文件中引入<boost/mem_fn.hpp>頭文件前定義宏:#defineBOOST_MEM_FN_ENABLE_STDCALL
2)#include<boost/mem_fn.hpp>3)我們定義一個函數(shù),例如shared_ptr<IWhatever>make_shared_from_COM(IWhatever*p)、{p->AddRef();//注意mem_fn仿函數(shù)的用法,它用于成員函數(shù),&類名::成員函數(shù)名shared_ptr<IWhatever>pw(p,mem_fn(&IWhatever::Release));returnpw;}一旦使用shared_ptr享有com的接口指針?biāo)袡?quán)后,com的引用計數(shù)被shared_ptr所接管,因此所有引用計數(shù)增減都是由shared_ptr來進(jìn)行.32第三十二頁,共41頁。第九節(jié):shared_ptr一些使用技巧:6、使用shared_ptr持有一個win32handle例如win32使用HANDLE來代表內(nèi)核對象,所有內(nèi)核對象都使用CreateXXX創(chuàng)建一個句柄,而使用CloseHandle來釋放一個句柄。typedefvoid*HANDLE;//win32HANDLE的內(nèi)部定義,在windows中可以看到HANDLECreateMutex();BOOLCloseHandle(HANDLE);使用shared_ptr來管理上述類型的HANDLE,代碼如下:typedefshared_ptr<void>handle;33第三十三頁,共41頁。第九節(jié):shared_ptr一些使用技巧:6、使用shared_ptr持有一個win32handleBOOLMyCloseHandleWrap(HANDLEh){std::cout<<“調(diào)用win32CloseHandleAPI\n”;returnCloseHandle(h);}handlecreateMutexHandle(){shared_ptr<void>ptr(CreateMutex(NULL,FALSE,NULL),MyCloseHandleWrap/*CloseHandle*/);}34第三十四頁,共41頁。第九節(jié):shared_ptr使用技巧7、使用shared_ptr持有一個靜態(tài)分配的對象有時候我們需要使用shared_ptr來管理一個靜態(tài)分配的對象或全局對象,例如staticXxobj;由于靜態(tài)或全局對象的析構(gòu)是在程序結(jié)束時候自動進(jìn)行的,我們不能夠在shared_ptr中自動調(diào)用delete操作符,因此我們可以實現(xiàn)一個NULL析構(gòu)器來實現(xiàn)該目的
structnull_deleter//仿函數(shù)對象{//重載函數(shù)調(diào)用操作符()voidoperator()(void*const)const{}//沒有任何代碼};shared_ptr<X>CreateX(){shared_ptr<X>px(&xobj,null_deleter());returnpx;}
35第三十五頁,共41頁。第九節(jié):shared_ptr使用技巧8、使用shared_ptr<void>持有任意對象的所有權(quán) 1)使用shared_ptr<void>來獲得任何對象的所有權(quán): 在該shared_ptr<void>離開作用域時候,會自動調(diào)用該shared_ptr所享有的實際對象的析構(gòu)函數(shù), 2)如果要使用實際對象的相關(guān)成員函數(shù): 需要使用: boost::static_pointer_cast boost::dynamic_pointer_cast boost::const_pointer_cast boost::reinterpret_pointer_cast 這四個轉(zhuǎn)型模板函數(shù)。36第三十六頁,共41頁。第九節(jié):shared
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農(nóng)村合作社政策咨詢服務(wù)指南
- 食品企業(yè)供應(yīng)鏈管理作業(yè)指導(dǎo)書
- 建筑公司租賃車輛合同
- 三農(nóng)村社區(qū)建設(shè)與管理方案
- 臨時工程建設(shè)施工合同
- 工業(yè)固體廢物資源化利用與處置作業(yè)指導(dǎo)書
- 閥門泵基礎(chǔ)知識培訓(xùn)課件
- 工作計劃模板集
- 社會契約論思想解讀教學(xué)教案:政治哲學(xué)專題研究
- 建設(shè)工程施工總承包協(xié)議書
- 大學(xué)生心理健康知識競賽題庫與答案
- 六年級上冊音樂課件 《校園小戲迷》人音版
- 2023版北京協(xié)和醫(yī)院重癥醫(yī)學(xué)科診療常規(guī)
- 不銹鋼管道拆除施工方案方案
- HSE管理主要法律法規(guī)、標(biāo)準(zhǔn)和文件目錄
- 中國移動-單位證明參考模板
- 中國傳媒大學(xué)-廣告媒體策劃與應(yīng)用(第2版)-課件
- 玻璃工藝學(xué)第4章 玻璃的性質(zhì)
- 四川省藥械集中采購及醫(yī)藥價格監(jiān)測平臺操作指引
- 室內(nèi)采暖管道安裝施工工藝標(biāo)準(zhǔn)規(guī)范標(biāo)準(zhǔn)
- 監(jiān)理大綱(范本)
評論
0/150
提交評論