所謂smart pointers 就是看起來用起來想內建指標,提供更多機能
包括各種用途,資源管理以及自動重複寫碼工作
當你用smart pointers取代c++內建指標的時候,你會獲得以下各種指標行為控制權:
當指向該物件的最後乙個smart pointers被銷毀的時候,會刪除物件。
當乙個smart pointer被複製或涉及賦值動作,不管是深複製,還是指標本身的複製,或者不允許複製
所指之物的解引用
因為smart pointers有templetes必須有強烈的型別性
templateclass smartptr;
例如乙個分布式的系統,某些物件在本地,而某些在遠端,本地物件訪問比遠端訪問簡單而快速,讓所有物件因為本地和遠端處理方式的不同,可以用smart pointers
修改讓看起來相同
template//指向分布式資料庫(db)內的物件
class dbptr;
class tuple;
//完成運轉記錄
templateclass logentry;
void edittuple(dbptr&pt) while (pt->isvalid()==false);
}
smart pointer的構造行為一般比較明確,確定乙個目標物,然後用smart pointer的內部指標指向它
但是賦值和 複製和析構會因為擁有權問題
考慮auto_ptr的實現問題:
templateclass auto_ptr
~auto_ptr();
private:
t*pointee;
};class treenode{};
//在同乙個物件只能被乙個auto_ptr擁有的前提
void testptr()
所以auto_ptr取樣更加富有彈性解法,auto_ptr複製或者賦值物件擁有權轉移
templateclass auto_ptr
private:
t*pointee;
};templateauto_ptr::auto_ptr(auto_ptr&rhs)
templateauto_ptr& auto_ptr::operator=(auto_ptr&rhs)
//因為被以value方式傳遞的時候,物件擁有權就轉移了,很糟糕
//而且不能是const因為內部指標改變了
void printtreenode(ostream&s,auto_ptrp)
當這個函式呼叫完畢後,實參傳遞以後就會不指向任何東西,導致未定義的行為。
void printtreenode(ostream&s,const auto_ptr&p)
t& operator*()const
templatet*smartptr::operator->()const
smart pointers 是為了能夠模擬內部指標的行為,內部指標因為可能指向的物件又函式
並且可能存在返回型別不是引用造成的切割問題
templateclass smartptr;
但是這是有問題的
//void testnull()
templateclass dbptr
private:
t *pointee;
};
class tupleaccessors;
tupleaccessors merge(const tupleaccessors&ta1,const tupleaccessors&ta2);
tuple *pt1,*pt2;
merge(pt1,pt2);
無法將兩個tuple*轉換成為tupleaccessors
同時隱士轉換會有問題
dbptrpty = new tuple;
delete pt;
編譯器會隱士型別轉換讓函式呼叫成功 如果pt所指物會被刪除兩次
一次是pt 的析構函式 然後實際指標再刪除一次
class musicproduct;
class cassetee:public musicproduct;
class cd;public musicproduct;
void displayandplay(const musicproduct* pmp,int numtimes)
}void displayandplay(const smartptr&pmp,int numtimes);
void smartptrtest()
//那麼可以提供隱士型別轉換
class smartptr
private:
cassetee*pointee;
};class smartptr
private:
cd*pointee;
};
//缺點就是要加入很多這樣的轉換因為乙個繼承層次
所以可以用乙個語言擴充的性質
templateclass smartptr
//加入乙個opeartor void*()如果內部指標為null 返回0
operator void*();
private:
t*pointee;
};
void displayandplay(const smartptr&pmp,int numtimes);
void smartptrtest()
現在就成功的首先編譯器會在smarptr物件中尋找單一自變數的建構函式
再尋找隱士型別轉換操作符產生這個物件
還沒有的話就尋找member function templete尋找可以例項化的
class cassingle:public cassetee;
void displayandplay(const smartptr&pmp,int numtimes);
void displayandplay(const smartptr&pmp,int numtimes);
smartptrdumbmusic(new cassingle("achy break"));
displayandplay(dumbmusic,1);
//這樣會錯誤在內部指標的時候會選擇直接繼承的casseetee,但是智慧型指標不能分辨
void testsmartconst()
template
class smartpttoconst; };
智慧型指標 強弱智慧型指標
在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...
智慧型指標學習
最近接觸到智慧型指標很多,於是研究了一下智慧型指標的原理,寫下自己的心得體會,有不對的還請指正。智慧型指標產生的目的 因為在c 中,存在非常複雜的指標錯誤問題,例如,某個物件生成後,指向該物件的指標可能有多個,當我們用delete語句刪除其中的乙個指標後,物件就被銷毀,那麼其餘指向該物件的指標就會懸...
智慧型指標3
include include using namespace std define test smartptr class stub class sentry sentry private int lock template class refcountingtraits void unrefer...