1. 程式人生 > 其它 >Linux top命令詳解

Linux top命令詳解

智慧指標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物件