c++ 基礎知識(一) 指標
阿新 • • 發佈:2020-12-18
技術標籤:# c++基礎專欄
目錄
一、指標的基本概念
指標是一個特殊的變數,它裡面存放的值為一個記憶體中的一個地址。要搞清楚指標,需要知道四個方面:指標的型別,指標所指向的型別,指標的值和指標所指向的記憶體區。
舉例說明:
1、int *ptr;
2、char *ptr;
以上兩個指標宣告:
指標的型別:
1的指標型別為int*。
2的指標型別為char*。
指標所指向的型別:
1所指向的型別為int。
2所指向的型別為char。
指標的值:
指標的值是指指標本身儲存的數值,這個值被編譯器當做一個地址,而不是一個一般的值。
指標所指向的記憶體區:
從指標的值開始,到sizeof(指標所指向的型別)這塊記憶體區。
空指標:是指向NULL的指標,沒有指任何記憶體地址。
野指標:指向了一塊記憶體地址,但是這塊地址不存在。
二、智慧指標
那什麼是智慧指標呢?
智慧指標本質上是用來儲存指向動態分配物件指標的類,該指標來確保程式不存在記憶體洩漏且是異常安全的。我們下面一點點開始講解:
1、auto_ptr:
雖然這個auto_ptr已經廢棄了,但是我們還是來聊聊它的思想和不足之處。
#include <memory> int main() { //初始化方式1 std::auto_ptr<int> sp1(new int(8)); //初始化方式2 std::auto_ptr<int> sp2; sp2.reset(new int(8)); return 0; }
如上圖程式碼,sp1和sp2均持有一個在堆上分配int物件的類,這兩塊記憶體分別可以在sp1,sp2釋放時自動釋放。auto_ptr讓人容易誤用的是其不常用的複製語句。即當複製(拷貝複製或者operator=複製)一個auto_ptr物件時,原物件所持有的堆記憶體物件會轉移到新的物件中,
舉例:
std::auto_ptr<int> sp1(new int(8)); std::auto_ptr<int> sp2(sp1); if (sp1.get() != NULL) { std::cout << "sp1 is not empty." << std::endl; } else { std::cout << "sp1 is empty." << std::endl; } if (sp2.get() != NULL) { std::cout << "sp2 is not empty." << std::endl; } else { std::cout << "sp2 is empty." << std::endl; } //測試賦值構造 std::auto_ptr<int> sp3(new int(8)); std::auto_ptr<int> sp4; sp4 = sp3; if (sp3.get() != NULL) { std::cout << "sp3 is not empty." << std::endl; } else { std::cout << "sp3 is empty." << std::endl; } if (sp4.get() != NULL) { std::cout << "sp4 is not empty." << std::endl; } else { std::cout << "sp4 is empty." << std::endl; }
執行程式碼可以得出:
所以這個會發生意想不到的錯誤。基於這個缺陷,後來又引用了其他三種智慧指標:std::unique_ptr,std::shared_ptr,std::weak_ptr。