當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]我最不喜歡循規(guī)循矩,雖然是讓寫筆記,照著老師的ppt抄一遍有什么意思。所以我還是喜歡寫自己的東西。最近我有個怪癖,愛把所有帶指針的類都改造成使用智能指針來控制資源分配和回收。因為我認為既然是c++11

我最不喜歡循規(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?=?'