天天看點

實作auto_ptr的兩種方法

我們都知道,實作auto_ptr有兩種方法:

第一種方法:在上一篇部落格中我已經實作了,主要思想是管理權轉移。

第二種方法:它是我們c++标準庫中以前的一個版本,主要思想是在auto_ptr類中除了有一個指針的成員變量以外還有一個bool類型的成員變量_owner。構造函數中将_owner設為真,表示對象是指針所指向的記憶體的擁有者,當要指派時(ap1=ap2),将ap1的_owner置為true,ap2的_owner置為false。

這樣我們析構對象時隻要檢查它的_owner是否為true。為真就釋放記憶體,不為真就不釋放。

主要實作如下:

看完auto_ptr的實作,有人會問:

看起來這種方法更好些,它實作了可以一般指針的使用方式,可以有多個指針指向同一塊記憶體,并且都可以通路這塊記憶體,而我們知道,新版本的auto_ptr的實作方式(管理權轉移)最大的缺點就是不能有幾個指針指向同一塊記憶體,一個智能指針隻能指向一塊記憶體。

既然舊版本的智能指針實作方式比新版本的要好用,那為什麼會被替換呢?

請看下面一段代碼:

這段代碼是用舊版本實作的智能指針(ap1)指向一個動态開辟的記憶體,然後在if條件語句中又有一個ap2指向這塊記憶體,我們會知道,根據舊版的智能指針的實作原理,ap1的_owner為false,ap2的_owner為true。那麼除了if條件語句的局部作用域,ap2就自動調用析構函數釋放記憶體,那麼當我們在外面*ap1=3時,通路到的是一塊已經被釋放了的記憶體,那麼程式這時就會出現問題。

如果是新版的auto_ptr,它提供了一個公有成員函數getptr(),可以擷取指針_ptr,當發生這種情況時,它可以先判斷_ptr是否為空,然後才去通路記憶體。舊版本這樣做是無用的,因為ap1的_ptr并不為空。

繼續閱讀