日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中各种智能指针的实现及弊端(二)

發布時間:2024/4/11 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中各种智能指针的实现及弊端(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++中各種智能指針的實現及弊端(二)

文章目錄

    • C++中各種智能指針的實現及弊端(二)
    • 一:實現auto_ptr
    • 二、auto_ptr的問題及解決辦法

一:實現auto_ptr

C ++98版本的庫中提供了auto_ptr的智能指針:
auto_ptr文檔

// C++庫中的智能指針都定義在memory這個頭文件中 #include <memory> class Date { public:Date() { cout << "Date()" << endl;}~Date(){ cout << "~Date()" << endl;}int _year;int _month;int _day; };int main() {auto_ptr<Date> ap(new Date);auto_ptr<Date> copy(ap);// auto_ptr的問題:當對象拷貝或者賦值后,前面的對象就懸空了// C++98中設計的auto_ptr問題是非常明顯的,所以實際中很多公司明確規定了不能使用 auto_ptrap->_year = 2018;return 0; }
  • auto_ptr的實現原理:管理權轉移的思想,下面簡化模擬實現了一份AutoPtr來了解它的原理
// 模擬實現一份簡答的AutoPtr,了解原理 template<class T> class AutoPtr { public:AutoPtr(T* ptr = NULL): _ptr(ptr){}~AutoPtr(){if(_ptr)delete _ptr;}// 一旦發生拷貝,就將ap中資源轉移到當前對象中,然后另ap與其所管理資源斷開聯系,// 這樣就解決了一塊空間被多個對象使用而造成程序奔潰問題AutoPtr(AutoPtr<T>& ap): _ptr(ap._ptr){ap._ptr = NULL;}AutoPtr<T>& operator=(AutoPtr<T>& ap){// 檢測是否為自己給自己賦值if(this != &ap){// 釋放當前對象中資源if(_ptr)delete _ptr;// 轉移ap中資源到當前對象中_ptr = ap._ptr;ap._ptr = NULL;}return *this;}T& operator*() {return *_ptr;}T* operator->() { return _ptr;} private:T* _ptr; };int main() {AutoPtr<Date> ap(new Date);// 現在再從實現原理層來分析會發現,這里拷貝后把ap對象的指針賦空了,導致ap對象懸空// 通過ap對象訪問資源時就會出現問題。AutoPtr<Date> copy(ap);ap->_year = 2018;return 0; }

二、auto_ptr的問題及解決辦法

原理:

  • 缺陷:一旦發生拷貝后,就只能有一個對象可以操縱他們所管理的資源,因為原對象已經斷開和資源的鏈接
  • 解決辦法:可以引入一個變量控制資源的釋放權,即不斷開就對象和資源的聯系,發生拷貝時,讓就對象無法獲得資源釋放權即可,具體代碼自己實現,這個比較簡單,加一個bool類型的成員變量即可

但是采用上面的解決方法仍然有缺陷:

  • 可能會造成野指針問題

總結

以上是生活随笔為你收集整理的C++中各种智能指针的实现及弊端(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。