這篇文章主要為大家展示了“如何實現auto_ptr”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何實現auto_ptr”這篇文章吧。
我們一直強調成都網站建設、網站設計對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個安全靠譜的網站建設公司,企業(yè)網站我們建議是要么不做,要么就做好,讓網站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)網站建設公司不一定是大公司,創(chuàng)新互聯(lián)建站作為專業(yè)的網絡公司選擇我們就是放心。
實現auto_ptr有兩種方法:
第一種方法:在上一篇博客中我已經實現了,主要思想是管理權轉移。
第二種方法:它是我們c++標準庫中以前的一個版本,主要思想是在auto_ptr類中除了有一個指針的成員變量以外還有一個bool類型的成員變量_owner。構造函數中將_owner設為真,表示對象是指針所指向的內存的擁有者,當要賦值時(ap1=ap2),將ap1的_owner置為true,ap2的_owner置為false。
這樣我們析構對象時只要檢查它的_owner是否為true。為真就釋放內存,不為真就不釋放。
主要實現如下:
#include<iostream> using namespace std; template<class T> class AutoPtr { public: AutoPtr(T* ptr) :_ptr(ptr) , _owner(true) {} ~AutoPtr() { if (_owner) { delete _ptr; } } AutoPtr(AutoPtr<T>& ap) :_ptr(ap._ptr) , _owner(true) { ap._owner = false; } AutoPtr& operator=(AutoPtr<T>& ap) { if (this != &ap) { if (_owner) { delete _ptr; } _ptr = ap._ptr; _owner = true; ap._owner = false; } return *this; } T* operator->() { return _ptr; } T& operator*() { return *_ptr; } private: T* _ptr; bool _owner; };
看完auto_ptr的實現,有人會問:
看起來這種方法更好些,它實現了可以一般指針的使用方式,可以有多個指針指向同一塊內存,并且都可以訪問這塊內存,而我們知道,新版本的auto_ptr的實現方式(管理權轉移)最大的缺點就是不能有幾個指針指向同一塊內存,一個智能指針只能指向一塊內存。
既然舊版本的智能指針實現方式比新版本的要好用,那為什么會被替換呢?
請看下面一段代碼:
AutoPtr<int> ap1(new int(1)); if (1) { AutoPtr<int> ap2(ap1); } *ap1 = 3;
這段代碼是用舊版本實現的智能指針(ap1)指向一個動態(tài)開辟的內存,然后在if條件語句中又有一個ap2指向這塊內存,我們會知道,根據舊版的智能指針的實現原理,ap1的_owner為false,ap2的_owner為true。那么除了if條件語句的局部作用域,ap2就自動調用析構函數釋放內存,那么當我們在外面*ap1=3時,訪問到的是一塊已經被釋放了的內存,那么程序這時就會出現問題。
如果是新版的auto_ptr,它提供了一個公有成員函數GetPtr(),可以獲取指針_ptr,當發(fā)生這種情況時,它可以先判斷_ptr是否為空,然后才去訪問內存。舊版本這樣做是無用的,因為ap1的_ptr并不為空。
以上是“如何實現auto_ptr”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享名稱:如何實現auto_ptr
網站URL:http://jinyejixie.com/article34/ijgdpe.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供外貿網站建設、App開發(fā)、網站內鏈、響應式網站、電子商務、網站建設
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)