C 智慧型指標

2021-09-09 02:36:57 字數 3301 閱讀 4447

為什麼會有智慧型指標?

rall(resource acquisition is initialization)是一種利用物件生命週期來控制程式資源的技術

不需要顯式的釋放資源

物件所需的資源在生命週期內始終保持有效

簡單的實現乙個智慧型指標:

templateclass smartptr

~smartptr()

}t& operator*()

t* operator->()

smartptr(const smartptr& sp) = delete;

smartptr& operator=(const smartptr& sp) = delete;

private:

t* _ptr;

};

對於智慧型指標要遵循以下兩點:

raii特性

過載operator*和operator->,具有像指標一樣的行為

auto_ptr是c++98版本的庫中提供的智慧型指標

對於auto_ptr存在的問題:管理權轉移

自我模擬實現c++庫中的auto_ptr智慧型指標

templateclass autoptr

​  ~autoptr()

}​  t& operator*() ​

t* operator->() ​

autoptr(autoptr& t)

: ptr(t.ptr) ​

t& operator=( autoptr& t)

ptr = t.ptr;

t.ptr = null;

}​    return *this;

}​private:

t* ptr;

};

可以看出噹噹進行拷貝構造以及賦值的時候,就會出現讓乙個智慧型指標置為null從而導致,管理權轉移

c++11提供的智慧型指標,對於該智慧型指標為了防止管理權轉移的情況,直接將拷貝構造以及賦值運算子過載置為delete函式,也就是只宣告不實現,並且將其訪問許可權設定為私有,不讓類外進行訪問。

自我實現:

templateclass uniqueptr

​  ~uniqueptr()

}​  t& operator*() ​

t* operator->() ​

private:

//c++98

uniqueptr(uniqueptr& t);

t& operator=(uniqueptr& t);

​  //c++11

//uniqueptr(uniqueptr& t) = delete;

//t& operator=(uniqueptr& t) = delete;

private:

t* _ptr;

};

對於unique_ptr智慧型指標,直接不讓進行拷貝構造和賦值,杜絕了管理權轉移的情況

c++11提供的可以進行拷貝構造以及賦值的智慧型指標並且不會出現管理權轉移的情況

實現方法:是通過引用計數的方式實現的多個shared_ptr物件之間共同管理乙份資源

自我模擬實現shared_ptr:

templateclass sharedptr

}​~sharedptr() ​

t* operator->() ​

t& operator*() ​

sharedptr(sharedptr& sp)

: _ptr(sp._ptr)

, _refcount(sp._refcount)

, _pmutex(sp._pmutex)

}​  sharedptr& operator=(sharedptr& sp)

}​    return *this;

}​int subrefcount() ​

int addrefcount() ​

t* get() ​

int& usecount() ​

private:

void release()

}​private:

t* _ptr;

int*  _refcount;

std::mutex* _pmutex;

};

執行緒安全的問題:

對於shared_ptr可以實現多個物件管理乙份資源,那麼就要考慮到執行緒安全的問題

對於兩個執行緒的智慧型指標同時對引用計數進行++或--的操作

對於指標兩個執行緒的智慧型指標管理的物件放在堆上,兩個執行緒同時去訪問就會導致執行緒安全的問題

迴圈引用:

struct listnode

};int main()

迴圈引用分析:

node1和node2兩個智慧型指標物件指向兩個節點,引用計數變為1

node1的_next指向node2,node2的 _prev指向node1,引用計數變為2

引用計數為1,node1和node2不會進行資源的釋放

但是_next屬於node1的成員,node1釋放了 _next才會釋放,但是 _prev屬於node2,所以兩個就都不會釋放。就是在迴圈引用,和死鎖一樣。

解決方案:

守衛鎖:防止異常安全的死鎖問題

自我實現:

templateclass lockguard

​  ~lockguard() ​

lockguard(const lockguard& lg) = delete;

lockguard& operator=(const lockguard& lg) = delete;

​private:

mutex& _mutex;

};

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...