C 實現智慧型指標 一

2021-08-19 16:34:42 字數 1983 閱讀 5114

參考自《c5-c++ primer》和實驗樓相關實驗。

一. 智慧型指標概念

c++中,通過new/delete這對運算子進行動態記憶體的管理。動態記憶體使用很容易出問題,因為確保在正確時間釋放記憶體是很困難的。有時忘記釋放記憶體,產生記憶體洩漏;有時在指標還引用記憶體時就釋放了它,產生引用非法記憶體的指標。因此,為了更容易和安全地使用動態記憶體,c++11提供了智慧型指標(smart pointer)型別來管理動態物件。

所謂的智慧型指標,首先它是乙個指標,所以能指向記憶體資源;然後它區別於一般的指標,它是智慧型的,而所謂的智慧型是指它:1.能夠自動的幫你釋放記憶體,2.還能夠知道什麼時候釋放記憶體才是安全的。

標準提供兩種智慧型指標:shared_ptr允許多個指標指向同乙個物件;unique_ptr獨佔所指物件;weak_ptr指向shared_ptr所管理的物件。本實驗主要實現shared_ptr的功能。

c++中智慧型指標的實現主要依賴於兩個技術概念:

1. 析構函式,物件被銷毀時會被呼叫的乙個函式,對於基於棧的物件而言,如果物件離開其作用域則物件會被自動銷毀,而此時析構函式也自動會被呼叫。

2. 引用計數技術,維護乙個計數器用於追蹤資源(如記憶體)的被引用數,當資源被引用時,計數器值加1,當資源被解引用時,計算器值減1。

智慧型指標的大致實現原理就是在析構函式中,檢查所引用物件的引用計數,如果引用計數為0,則真正釋放該物件記憶體。

二. 實現版本v1

實現智慧型指標:標頭檔案 smartpointer.h

/* 

* file name : smartpointer.h

* desp : 智慧型指標版本v1

*/#ifndef __smartpointer_h__

#define __smartpointer_h__

template // 將智慧型指標類定義成模板類

class smartpointer

// 接收不同指標型別的建構函式

smartpointer(t *p):mpointer(p)

int main(void)

編譯執行:

$ g++ -o sptestcase1 sptestcase1.cpp

$ ./sptestcase1

執行結果分析:

簡單實現智慧型指標類,智慧型指標釋放指向「hello world」指標時出錯。我們的智慧型指標不能指向無法被delete釋放的記憶體資源。

三. 知識點查漏補缺

(1)int *p=new int;//無初始化

(2)int *p=new int(5);//初始化為5

(3)建立類 test *test=new test(); delete test;//加括號呼叫沒有引數的建構函式,不加括號呼叫預設建構函式或唯一的建構函式

(4)int *p=new int[10];//開闢容量為10的陣列 delete p;

//類的定義

templateclass test

test(t k);

~test(){}

void print();

t operator+(t x);

};//類的使用

類名《實際的型別》 eg.testtest;//宣告乙個物件

//位址?轉換型別? 

我們這裡定義的是模版類,因為不知道這個指標的具體型別。使用使用了const void *。

const void * p 這是定義了乙個指標p,p可以指向任意型別的值,但它指向的值必須是常量。在這種情況下,我們不能修改被指向的物件,但可以使指標指向其他物件。

C 智慧型指標實現

1 問題的提出 先看下面的例子 class ctext ctext private int m ptr int funtext 在函式funtext 中,類的兩個物件共用了new出來的指標ptr。當函式執行開始時,呼叫兩次建構函式 退出執行時,呼叫兩次析構函式,而在第一次呼叫時已經delete pt...

智慧型指標實現C

include using namespace std template class shared ptrelse shared ptr const shared ptr ptr shared ptr operator const shared ptr ptr if this ptr this pt...

C 實現智慧型指標

c 11增加了智慧型指標 shared ptr unique ptr weak ptr 為了加深理解,自己實現智慧型指標 我們都知道shared ptr的核心思想通過引用計數來管理記憶體 先實現單個指標的自我管理,看下面 template class ref ref t p m ptr p ref ...