設計原理:
將基本型別指標封裝為類物件指標(這個類肯定是個模板,以適應不同基本型別的需求),並在析構函式裡編寫delete語句刪除指標指向的記憶體空間。
auto_ptr
則c++會把m_example所指向的記憶體**,使m_example1 的值為null,所以在c++中,應絕對避免把auto_ptr放到容器中。即應避免下列**:
vector>m_example;
當對容器操作的時候,賦值傳遞會使容器中多個元素被置為null,而這不是我們想看到的。
unique_ptr
避免了指標指向有效資料的問題,會出現編譯錯誤提示,即:
unique_ptr pu1(new
string ("hello world"));
unique_ptr pu2;
pu2 = pu1; // not allowed
unique_ptrpu3;
pu3= unique_ptr(new string("yo!"));
//allowed
將乙個unique_ptr賦給另乙個時,如果源unique_ptr是個臨時右值,編譯器允許這樣做;如果源unique_ptr將存在一段時間,編譯器將禁止這樣做
還可以用std::move()將乙個unique_ptr賦給另乙個
unique_ptr ps1, ps2;
ps1 = demo("hello");
ps2 = move(ps1);
ps1 = demo("alexia");
cout << *ps2 << *ps1 << endl;
另外, 可將unique_ptr儲存到stl容器,只要不呼叫將乙個unique_ptr複製或賦給另乙個的相關演算法(如sort())shared_ptr
shared_ptr
和auto_ptr
最大的區別就是,
shared_ptr
解決了指標間共享物件所有權的問題,也就是
auto_ptr
中的賦值的奇怪問題。所以滿足了容器的要求,可以用於容器中。
傳送門
c 基礎 使用智慧型指標
三個智慧型指標模板 auto ptr unique ptr和shard ptr 都定義了類似指標的物件 c 11已將auto ptr摒棄 可以將new獲得 直接或間接 的位址賦給這種物件。當智慧型指標過期時,其析構函式將使用delete來釋放記憶體。因此,如果將new返回的位址賦給 這些物件,將無需...
c 智慧型指標基礎詳解
在現代 c 程式設計中,標準庫包含了智慧型指標 smart pointers 智慧型指標用來確保程式不會出現記憶體和資源的洩漏,並且是 異常安全 exception safe 的。智慧型指標定義在標頭檔案 memory 裡的命名空間 std 中。它對於資源獲取即初始化 raii,resource a...
c 智慧型指標
auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...