字型大小:小
大 2012-10-23 15:55
c++中智慧型指標的引入,使得開發人員在與記憶體的鬥爭中佔據上峰。然而凡事都不會盡善盡美,智慧型指標的迴圈引用缺陷還是會引發令人談虎色變的記憶體洩露。本文的內容就是講述,如何解決迴圈引用帶來的記憶體問題。
背景:智慧型指標採用boost庫,語言c++,開發工具vs2005,示例程式為win32程式。
關於boost庫的使用,可見另一篇文章
迴圈引用示例
#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
using namespace boost;
class ccycleref
public:
shared_ptr selfref;
};void cyclereftest()
int _tmain(int argc, _tchar* argv)
執行結果:
reference count:2
建立的ccycleref物件沒有釋放掉。
原因是ccycleref類進行了自引用,引用計數增加所致。
迴圈引用解決
引入weak_ptr弱引用指標即可解決迴圈引用問題。weak_ptr不會修改引用計數。
修改ccycleref類。
class ccycleref
public:
weak_ptr selfref;
};執行結果
reference count:1
destroying ccycleref
建立的ccycleref物件已被釋放。
智慧型指標的迴圈引用與解決
class node node private int value int main 上面的程式不會有問題,呼叫三次建構函式,三次析構函式。下面增加乙個指向父節點的指標。class node node private int value int main 呼叫了三次建構函式,但是沒用呼叫析構函式,這...
智慧型指標的死穴 迴圈引用
c 最新標準c 11中已將基於引用計數的智慧型指標share prt收入囊中,智慧型指標的使用門檻越來越低,不需要使用boost庫,我們也能輕鬆享受智慧型指標給我們帶來的方便。智慧型指標,正如它的名字一樣,似乎是個近乎完美的聰明角色,程式設計師不用再糾結於new出來的內存在哪釋放比較合適這種問題。比...
迴圈引用 智慧型指標的死穴之一
智慧型指標的實現思路也體現了c 基於物件的原則,物件應該為自己管理的資源負責,包括資源的分配與釋放,而且最好將資源的釋放與分配搞的自動化一點,典型的實現方法就是在建構函式裡分配資源,在析構函式裡釋放資源,這樣當其他程式設計師在使用這個物件時,該物件的資源問題幾乎不用額外的操心,即優雅又方便 然後如此...