很大程度上,野指標都是因為編碼不善,習慣不好所產生的.
要解決野指標,就要養成好習慣,不要動不動就public資料成員,所有的資料訪問都抽象成介面,最好只在乙個地方delete資料.
前段時間遊戲技術測試,down機無限,搞的很頭疼.後來用valgrind的memcheck工具,找到很多野指標.
valgrind很好用,除了有一點慢:-)
valgrind --tool=memcheck --leak-check=full --log-file=./log_file.log --showpossibly-lost=no --malloc-fill=0xff --free-fill=0x11 ./execfile
用上面的語句,就可以啟動乙個execfile,順便把所有malloc記憶體設定成0xff,free記憶體設定成0x11,還會統計記憶體洩露(在log_file.log內).簡單易用.
然後麼,乙個乙個去fix....
跟同學交流,他們那邊有乙個辦法,去解決這個野指標問題,也是很巧妙的,不敢獨享:-d
a物件會被n個其他物件b引用,就是其他n個物件b會持有指向a的指標.
如果a被delete,其他n個物件b指向a的指標的記憶體已經不可訪問,這個時候訪問那塊記憶體,就會發生未定義行為.
天知道會怎麼樣!!!也許會down掉,也許不會.
他們是搞的:
1) 物件b對a的引用,a自己會儲存乙份記錄,標記有物件b引用過自己
2) 物件b析構,會通知a,這個時候,a會去除b對自己的引用的標記
3) a析構,a會把所有指向自己的指標,設定成null
這是基本思想.
下面給出簡單的實現,非執行緒安全,有什麼問題可以提出...
#ifndef __referable_h__#define __referable_h__
#include #include "ref_ptr.h"
templateclass referable
}private:
typedef typename std::vectorcontainer_type;
typedef typename container_type::iterator container_iter;
friend class ref_ptr;
void on_reg(refaddress addr)
m_references.push_back(addr);
}void on_unreg(refaddress addr)
}private:
container_type m_references;
};#endif
#ifndef __reference_pointer_h__#define __reference_pointer_h__
#include "referable.h"
templateclass ref_ptr
ref_ptr(t *ptr):m_ptr(ptr)
ref_ptr(const ref_ptr& ref):m_ptr(ref.m_ptr)
virtual ~ref_ptr()
ref_ptr& operator = (const ref_ptr& ref)
ref_ptr& operator = (t *ptr)
return *this;
}public:
t* operator->() const
t& operator*() const
operator t*() const
operator bool() const
private:
void add_ref()
void remove_ref()
private:
t* m_ptr;
};#endif
測試**:
class object : public referable;void test()
這個東西看上去還不錯.
不過習慣還是很重要滴
ps:一般引用都是只有四五個,所以vector效能足夠好,我測試過~~
C語言野指標的產生原因及避免辦法
見如下程式例項 include include int main printf p1 d,p1 d n p1,p1 if p1 null 目的 釋放p1 printf p1 d,p1 d n p1,p1 system pause return 0 程式執行結果為 p1 0,p1 2031188 p1...
野指標產生原因及解決辦法
原因 指標變數宣告時沒有被初始化。解決辦法 指標宣告時初始化,可以是具體的位址值,也可讓它指向null。原因 指標 p 被 free 或者 delete 之後,沒有置為 null。解決辦法 指標指向的記憶體空間被釋放後指標應該指向null。原因 指標操作超越了變數的作用範圍。解決辦法 在變數的作用域...
野指標的產生及其避免
野指標的產生及其避免 null 避免,而只能通過養成良好的程式設計習慣來盡力減少。對野指標進行操作很容易造成程式錯誤。總的來說,野指標是一種記憶體錯誤。其產生的原因主要有一下幾點 1 訪問了不該訪問的記憶體 如果我們的指標變數沒有被我們初始化,系統會為我們的編譯器隨機為我們的指標指定記憶體。既然是系...