先來看一段**:
void test()
//dosomething
delete p1;
}
以上存在在的問題我們可以在return之前釋放空間,也可以通過下面拋異常來解決這個問題,但是儘管如此,我們有時也很難避免記憶體洩漏,這時就引入了智慧型指標。
void dosomething ()
void test2 ()
catch(...)
//...
delete p1 ;
}
1:智慧型指標的發展歷史![](https://pic.w3help.cc/9c8/7cb8cf825340abd80672af31d3d06.jpeg)
auto_ptr/scoped_ptr/shared_pr/weak_ptr的設計思想、缺陷
auto_ptr:
template
class auto_ptr
auto_ptr(auto_ptr& ap) //拷貝建構函式
:_ptr(ap._ptr)
//當進行拷貝構造時,直接把ap._ptr賦值為null,將管理權交給_ptr
auto_ptr& operator=(auto_ptr& ap) //賦值運算子的過載
//把ap._ptr給_ptr,ap._ptr賦值為null,將管理權交給_ptr
-ptr = ap._ptr;
ap._ptr = null;
}return *this;
}~auto_ptr() //析構函式
}t* operator->()
t& operator*()
private:
t* _ptr;
};
當我們進行一般簡單的使用操作時並不會出現什麼問題,但是,因為auto_ptr的設計思想是管理權的轉移,當我們利用p1賦值或者拷貝構造給p2時,p1就會置null,當我們再去訪問舊的指標時就會出錯。
為了解決auto_ptr拷貝構造和賦值後對舊指標操作出錯問題,我們引入了scope_ptr,它的設計思想就是防拷貝,當使用者需要拷貝或者賦值時,程式直接報錯。我們模擬實現時,將拷貝構造和賦值運算子過載只宣告不實現,並將其設為私有。
template
t>
class
scoped_ptr
~scoped_ptr
()
}t* operator->()
t& operator*()
private:
//拷貝構造和賦值運算子過載只宣告不實現,並宣告為私有防止類外實現
scoped_ptr
(scoped_ptr
& sp);
scoped_ptr
& operator=(scoped_ptr
& sp);
t* _ptr;
};
shared_pr:
設計思想:引用計數,多個指標指向同一塊空間,
template
t>
class
shared_ptr
shared_ptr
(shared_ptr
& sp)
:_ptr(sp._ptr)
, _refcount(sp._refcount)
shared_ptr
& operator=(shared_ptr
& sp)
_ptr = sp._ptr;
_refcount = sp._refcount;
(*_refcount)++;
}return *this;
}shared_ptr
& operator=(shared_ptr
& sp)
~shared_ptr
()
}t* operator->()
t& operator*()
t* getptr
()
private:
t* _ptr;
int* _refcount;
};
然而,shared_ptr存在迴圈引用的缺陷問題:
struct listnode
};void test()
執行該程式可以看到,即使退出了test函式後,由於cur和next物件互相引用,它們的引用計數都是1,不能自動釋放,並且此時這兩個物件再無法訪問到。這就引起了記憶體洩漏。
一般來講,解除這種迴圈引用有下面有三種可行的方法:
1、當只剩下最後乙個引用的時候需要手動打破迴圈引用釋放物件。
2、當cur的生存期超過next的生存期的時候,next改為使用乙個普通指標指向cur。
3、使用弱引用的智慧型指標打破這種迴圈引用。
雖然這三種方法都可行,但方法1和方法2都需要程式設計師手動控制,麻煩且容易出錯。這裡主要介紹一下第三種方法。
weak_ptr:解決shared_ptr的迴圈引用問題,只負責管理,不負責釋放
templateclass weak_ptr
weak_ptr(const shared_ptr& sp)
:_ptr(sp._ptr)
{}t & operator*()
t & operator->()
private:
t* _ptr;
};
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 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...