C 智慧型指標

2021-06-29 10:31:36 字數 2406 閱讀 8387

c++智慧型指標主要是在普通指標的基礎上封裝了一層,使得使用者對指標的使用更加方便和放心,在使用的過程中不用擔心指標因為釋放問題而導致的異常。在c++11中,智慧型指標主要有三種:shared_ptrptr, unique_ptrptr, weak_ptrptr;

shared_ptrptr的初始化可以通過以下幾種方式:

1)shared_ptrptr = make_shared(args); //args的引數形式和t的建構函式一致。

2)shared_ptrptr(q); //q可以是乙個智慧型指標或者普通指標**換成t*的也行,比如&v),還能是一塊新分配的記憶體。

3)shared_ptrptr = q; //q可以是智慧型指標或者一般指標,但不能是一塊新分配的記憶體。

4)shared_ptrptr(u); //u是乙個unique_ptr,此時u被被置位null,ptr指向u之前所指向的物件。

5)shared_ptrptr(q, d); //和方法2)類似,但是會用新的刪除函式d取代delete

但是智慧型指標最好不要和不同指標混著用。

其它一些操作,如:

1)ptr = q;     //ptr指向q指向的物件,q必須是智慧型指標。ptr和q的模版型別不一定要完全一樣,只要可以從q的模版型別轉向ptr的模版型別即可。此時ptr原來指向的物件引用計數減1,q指向的物件引用計數加1。

2)ptr.unique();//返回ptr所指向的物件引用數是否為1。

3) p.use_count(); //後者返回ptr所指向物件引用數。

與一般指標相比,shared_ptr主要可以用來防止記憶體洩漏和懸掛指標:

1)記憶體洩漏是指動態分配的記憶體被遺忘釋放了,導致這塊記憶體一直不能被**,一般較難檢測出來,除非****存非常多導致程式記憶體不夠用了。如果使用普通指標,就可能導致這個問題,比如:t *p = new t(); t *p= new t(); 此時p第一次指向的記憶體塊就洩漏了。還有一種情況也可能導致記憶體洩漏:

t* f(t arg)

//此時如果ptr不主動釋放他所指向的記憶體,等到出了函式f的範疇,ptr指向的空間就會出現記憶體洩漏。

而智慧型指標本身也是乙個物件,它有自己的析構函式,當智慧型指標失效時,它會自動呼叫析構函式,刪除自身,並將所指向物件的引用值減1,引用值為0就會刪除所指向物件。

2)懸掛指標是指向一塊記憶體空間,這塊記憶體空間之前儲存乙個物件,但是後來因為delete其他指標時被刪除了,此時該指標就是懸掛指標。而使用智慧型指標,當刪除乙個智慧型指標時,首先將指向物件的引用值減1,如果此時引用值為0才會刪除該物件。

ptr.reset(); //是指ptr不再指向之前所指向的物件。

ptr.reset(q); //是指ptr不在指向之前所指向的物件,轉而指向q所對應或指向的空間。

ptr.reset(q, d); //同上,只是用d替換了delete函式,在必要時,會呼叫d刪除之前所指向的物件。

使用智慧型指標需要注意以下幾點:

1)不要使用不同指標初始化或者reset多個智慧型指標。

2)不要delete從get()返回的指標。

3)不要使用get()返回的指標去初始化其它智慧型指標。

4)如果使用了get(),需要注意,智慧型指標將所指空間內容刪除時,會使得get()返回的物件指標成為懸掛指標。

unique_ptrptr是乙個可以保證只有乙個unique_ptr指標指向乙個物件,它的初始化方法只要有以下幾種:

1)unique_ptrptr(q); //q可以是一塊新分配的記憶體或者普通指標。

2)unique_ptrptr = ...; 和shared_ptr不同,unique_ptr需要指定自定義刪除函式型別的指標。

ptr.release(); //此時ptr不再指向之前所指向的物件,並返回之前所指向物件的指標,呼叫這個函式的時候,最好(務必)將函式的返回值存到某個指標,不然就記憶體洩漏了。

shared_ptr和unique_ptr幾個相同的函式:

1)p; //用p作為條件判斷指標p是否為空。

2)*p; //取p所指向的物件引用。

3) p->mem; //訪問p所指物件的成員變數。

4)p.get(); //返回所指物件的普通指標。

weak_ptr顧名思義,弱指標,將乙個shared_ptr繫結到weak_ptr不會影響shared_ptr所指向物件的引用數。他主要有以下幾個方法:

1)weak_ptrw = sp; 以及 w = sp; //將乙個share_ptr繫結到weak_ptr。

2)weak_ptrw(sp); //同上。

3)reset(); //釋放繫結的sp;

4)use_count(); //所指物件的引用數。

5)expired(); //判斷use_count()是否為0。0返回true,否則返回false。

6)lock(); //返回所繫結的乙個shared_ptr,如果已經不存在,則返回乙個空的shared_ptr。

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...