C 智慧型指標

2021-08-10 22:46:13 字數 1041 閱讀 5317

這裡所說的都不是stl裡的東西,只是簡單的模仿一下。

程式裡一般我們將一些常用的,不是臨時的物件放在堆上,堆的空間是比較大的。但是如果我們只是不停的動態申請但是忘記在不使用的時候歸還就會造成記憶體洩露。有時候我們也會因為同一塊記憶體空間被多個指標指向,在釋放時造成多次釋放的問題。為了避免這些,所以我們試著來建立乙個特殊的指標。

1在生命週期結束的時候直接釋放掉堆裡的記憶體空間

2且這個指標指向的記憶體不會再被別的指標指向這裡。

3為了防止出現野指標和2的情況出現,所以我們不允許對指標做運算和比較。

這就是我們的「智慧型指標」,我們可以建立乙個類,類裡面有乙個成員變數,是乙個指標,這樣如果就滿足了上述的第三條,應為此時是我們建立的乙個物件,不滿足那些操作符。我們使用建構函式的引數列表讓使用者將動態分配的位址傳入,在函式體中賦值給成員變數,這樣就滿足了上述的第二條。最後我們在析構函式釋放這個動態申請的記憶體,這樣就滿足了第三條。最後為了讓這個物件滿足指標的取址操作,我們要過載->和*這兩個操作符。還有一點,因為這裡的成員是指標,所以我們的拷貝建構函式和=的過載必須實現深拷貝,而且只能讓記憶體只屬於某個指標,c++裡雖然不允許多次釋放乙個堆記憶體,但是可以多次delete內容為null的指標,所以我們要使用這一特性。

切記,我們這裡必須是堆上的記憶體。「智慧型指標」只適用於堆空間。

class test

int value()

~test()

};class pointer

/*因為要滿足第2條,所以一塊記憶體只能被乙個指標指向,所以右值的成員變數要設定為null*/

pointer(const pointer& obj)

pointer& operator = (const pointer& obj)

return *this;

}test* operator -> ()

test& operator * ()

bool isnull()

~pointer()

};

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 智慧型指標

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