我最不喜歡循規(guī)循矩,雖然是讓寫筆記,照著老師的ppt抄一遍有什么意思。所以我還是喜歡寫自己的東西。
最近我有個怪癖,愛把所有帶指針的類都改造成使用智能指針來控制資源分配和回收。因為我認為既然是c++11標準出的應(yīng)該是可以頂替99標準,更安全更先進的用法,為什么不用呢?結(jié)果在這兩周侯捷老師的c++課上的例子的智能指針改寫上吃了苦頭,也領(lǐng)悟到什么時候該用智能指針,什么時候不該用。離提交作業(yè)的日期只剩兩天不到,有空的話我會將我對Date類,Rectangle類的改寫也在這里講一下。
我這里目的并不是講解智能指針,所以講的并不細。
什么是智能指針:
智能指針就是通過模板實現(xiàn)的對普通指針的一種封裝,我偏愛用shared_ptr指針。通過引用計數(shù),來管理自己的引用數(shù)量,當(dāng)計數(shù)為0時,自動釋放內(nèi)存。
什么時候該用它呢?
本來我有個A類型的指針:
A?*a?=?new?A();
這樣我還要操心去delete它。假如這行代碼在一個函數(shù)內(nèi),并且a會作為該函數(shù)的返回值返回的話(比如第一周的作業(yè)Date類隨機產(chǎn)生10個日期返回的函數(shù))那選擇什么時候delete就很重要了。有的時候不好抉擇,增加維護的復(fù)雜程度。
那么這就是智能指針大顯身手的時候。
shared_ptr?a?=?make_shared();
起到了和剛才那條語句一樣的效果。
假如這個函數(shù)是
shared_ptr?fun()?{ ??shared_ptr?a?=?make_shared(); //?對a做點什么 ?return?a; }
這樣的話,函數(shù)里定義a,引用計數(shù)為1,返回a,a的引用計數(shù)仍為1.而當(dāng)a使用完畢后,到了函數(shù)使用時所在作用域的結(jié)束位置時。a的引用計數(shù)會-1,此時為0,自動釋放內(nèi)存。不用我們?nèi)斯elete了。
String類不使用shared的模樣
這個String類是我自己寫的,但跟課程里的只有一點點不一樣。
返回成員的函數(shù)返回類型我設(shè)為const char*,因為這樣的話可以避免使用函數(shù)時對成員做出我們不期望的修改。
#ifndef?STRING_H #define?STRING_H #include#includeusing?std::ostream; class?String?{ public: ????String(const?char?*cstr?=?0); ????String(const?String&); ????String?&operator=(const?String&); ????~String(); ????const?char*?get()?const; private: ????char?*m_data; }; inline String::String(const?char?*cstr)?{ ????if?(cstr)?{ ????????m_data?=?new?char[strlen(cstr)?+?1]; ????????strcpy(m_data,?cstr); ????}?else?{ ????????m_data?=?new?char[1]; ????????*m_data?=?'