智能指針(一)初識

一、爲什麼要使用智能指針?

1.1 動態內存和使用原因

程序使用內存大概可以分爲“堆棧全常代”[1],和智能指針相關的是堆區,堆(heap)在C++中也被稱爲自由空間。自由空間的“自由”應該理解爲程序員自己編寫的自主控制其生命週期的空間,申請的空間大小相對寬裕[2]。

出於三個原因要使用動態內存

  • 程序不知道自己要使用多少對象。容器
  • 程序不知道所需對象的準確類型。多態
  • 程序需要在多個對象間共享數據。應用

除此,智能指針是異常安全的。即異常退出也會成功釋放對應內存。

1.2 管理動態內存的方法

C++可以使用new和delete完成對動態內存的申請和釋放,在程序中程序員負責對其進行申請和釋放。這種方式容易出現“內存泄漏”、“多次釋放同一空間”等問題,前者忘記釋放,後者無意中多次釋放。爲了減少這種管理動態內存上的困難,智能指針就出現了!C++有四個智能指針: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中後三個是C++11支持,並且第一個已經被C++11棄用[3]。

二、智能指針聲明和使用

智能指針的頭文件位於memory頭文件中。根據智能指針對動態內存的控制權力是共享還是獨佔分爲兩類,shared_ptr和unique_ptr。

shared_ptr<T> ssp=make_shared<T>(args);//make_shared最佳初始化共享指針方法
unique_ptr<T> usp(new T);//獨佔指針則沒有make_shared,接受一個new對象返回的指針

允許多個符合類型要求的shared_ptr指向同一動態內存,獨佔指針管理一個動態內存時,具有排他性,在編譯階段任何第二個嘗試指向該同一塊內存的都將會編譯失敗[4]。

[1] 堆區,棧區,全局(靜態)區,常量區和代碼區。
[2] 關於棧、堆、靜態存儲區最大可分配大小的探討. https://blog.csdn.net/lwnylslwnyls/article/details/8554613
[3] 詳解C++11智能指針.https://www.cnblogs.com/WindSun/p/11444429.html
[4] auto_ptr沒有管理好拷貝操作,會導致多次釋放內存,因此在unique_ptr將拷貝禁止了。但是臨時右值和std::move可以實現類似於“拷貝的操作”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章