实现auto_ptr的两种方法
我們都知道,實現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)指向一個動態開辟的內存,然后在if條件語句中又有一個ap2指向這塊內存,我們會知道,根據舊版的智能指針的實現原理,ap1的_owner為false,ap2的_owner為true。那么除了if條件語句的局部作用域,ap2就自動調用析構函數釋放內存,那么當我們在外面*ap1=3時,訪問到的是一塊已經被釋放了的內存,那么程序這時就會出現問題。
?
如果是新版的auto_ptr,它提供了一個公有成員函數GetPtr(),可以獲取指針_ptr,當發生這種情況時,它可以先判斷_ptr是否為空,然后才去訪問內存。舊版本這樣做是無用的,因為ap1的_ptr并不為空。
轉載于:https://blog.51cto.com/haipi/1760289
總結
以上是生活随笔為你收集整理的实现auto_ptr的两种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习汇编
- 下一篇: iTween基础之Color(变换颜色)