Linux top命令詳解
阿新 • • 發佈:2021-08-02
智慧指標VS傳統指標
傳統指標:
1.需要手動管理記憶體
2.容易發生記憶體洩漏(忘了釋放、流程異常導致未釋放)
3.釋放後沒有把變數置為nullptr,容易出現野指標
智慧指標
auto_ptr(C++98標準),已不推薦使用
Person *person = new Person(10);
auto_ptr<Person> p(person);
p->display();
auto_ptr<int[]> p1(new int[3]); //會報錯,不能用於陣列
auto_ptr的基本原理
簡單來講,就是包裝了模板和原始指標,在SmartPointer 銷燬的時候,將內部的指標銷燬
template<typename T>class SmartPointer { private: T *m_pointer; public: SmartPointer(T *pointer):m_pointer(pointer){} ~SmartPointer(){ if(m_pointer == nullptr) return; delete m_pointer; m_pointer = nullptr; } T *operator->() { //注意這個操作,是為了smartpoint可以呼叫包裝的指標方法 return m_pointer; } }; int main(){ { Person *person = new Person(10); SmartPointer<Person> p(person); p->display(); } return 0; }
shared_ptr
多個shared_ptr可以指向同一個物件,當最後一個shared_ptr在作用域範圍內結束時,物件才會被自動釋放,並且可以通過一個已經存在的智慧指標初始化一個新的智慧指標
shared_ptr<Person> p(new Person(10));
shared_ptr<Person> p1(p);
shared_ptr<Person[]> persons(new Person[5]{}); //針對陣列的用法
shared_ptr 的原理
一個shared_ptr會對一個物件產生強引用(strong reference),每個物件都有個與之對應的強引用計數,記錄著當前物件被多少個shared_ptr強引用著,可以通過shared_ptr的use_count函式獲得強引用計數,當有一個新的shared_ptr指向物件時,物件的強引用計數就會+1, 當有一個shared_ptr銷燬時(比如作用域結束),物件的強引用計數就會-1,當一個物件的強引用計數為0時(沒有任何shared_ptr指向物件時),物件就會自動銷燬(析構)。
double free 產生的問題,除此之外,shared_ptr 也會產生迴圈引用問題,因為他是依靠引用計數來判斷是否銷燬的。
Person *p = new Person();
{
shared_ptr<Person> p1(p);
}
{
shared_ptr<Person> p2(p);
}
weak_ptr
weak_ptr 的產生是為了解決shared_ptr 出現的迴圈引用問題,他會對一個對生產生弱引用,不會使引用計數+1。類似oc找那個__weak 解決block的迴圈引用問題
unique_ptr
unique_ptr也會對一個物件產生強引用,它可以確保同一時間只有1個指標指向物件, 當unique_ptr銷燬時(作用域結束時),其指向的物件也就自動銷燬了,可以使用std::move函式轉移unique_ptr的所有權
unique_ptr<Person> p(new Person());//p強引用Person物件
unique_ptr<Person> p1 = std::move(p);//move後,p1,強引用這Person物件