c++程式設計中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。管理是麻煩點(e.g. 手動釋放等),但無傷大雅,勉強可以接受;但要命的是,容易出問題:
為了解決該問題,c++ 11 引入智慧型指標概念使記憶體管理變得更為方便,且不易出錯:
智慧型指標包含在標頭檔案中,包括:shared_ptr、unique_ptr、weak_ptr。
對於乙個物件,允許有多個shared_ptr指向該物件,並使用引用計數方式統計指向該物件的shared_ptr個數。
#include #include using namespace std;
void testshared()
int main()
//輸出結果44
44012ac768
012ac768
012ac768
012ac76813
2
對於乙個物件,unique_ptr 「唯一」 擁有該物件(i.g. 同一時刻只能有乙個unique_ptr指向該物件),禁止通過拷貝構造,賦值等方式來使其它unique_ptr也指向該物件。
#include #include using namespace std;
void testunique()
int main()
//輸出結果
0124df58
0124df88
00000000
0124df58
0124df58
00000000
0124df58
00000000
weak_ptr是為了配合shared_ptr而引入的一種智慧型指標,它不具有普通指標的行為(i.g. 沒有過載 operator* 和 -> ),它的最大作用在於協助shared_ptr工作,像旁觀者那樣觀測資源的使用情況。
#include #include using namespace std;
void testweak()
}int main()
//輸出結果11
22210
100
#include using namespace std;
templateclass smartpointer
else
} smartpointer(const smartpointer& ptr)
} smartpointer& operator=(const smartpointer& ptr)
if (this->_ptr)
} this->_ptr = ptr._ptr;
this->_count = ptr._count;
(*this->_count)++;
return *this;
} t& operator*()
t* operator->()
~smartpointer()
} size_t use_count()
};void testprinciple()
int main()
智慧型指標 強弱智慧型指標
在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...
c 智慧型指標的問題 智慧型指標初探(一)
為什麼要有智慧型指標 在c 中,動態記憶體的管理一般是用一對運算子完成的 new和delete。new 在動態記憶體中為物件分配一塊空間並返回乙個指向該物件的指標。delete 指向乙個動態獨享的指標,銷毀物件,並釋放與之關聯的記憶體。使用new和delete動態記憶體管理經常會出現問題 忘記釋放記...
智慧型指標 一 shared ptr
特點 內部維護乙個計數來判斷記憶體釋放需要釋放。和boost scoped ptr相比,boost shared ptr可以共享物件的所有權,因此其使用範圍基本上沒有什麼限制 還是有一些需要遵循的使用規則,下文中介紹 自然也可以使用在stl的容器中。另外它還是執行緒安全的,這點在多執行緒程式中也非常...