C 野指標的產生以及應對辦法

2022-01-11 09:44:25 字數 2111 閱讀 7760

很大程度上,野指標都是因為編碼不善,習慣不好所產生的.

要解決野指標,就要養成好習慣,不要動不動就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 訪問了不該訪問的記憶體 如果我們的指標變數沒有被我們初始化,系統會為我們的編譯器隨機為我們的指標指定記憶體。既然是系...