很多程式初學者比較沒有在注意一些Memory處理上的問題。其實只要平時稍微注意一下,就可以避免掉很多問題,而且也可以讓你的程式更好以及更穩定。
首先,是指標變數內容的問題。通常各位在使用指標時,可能習慣不給予初始值。其實這會造成一些問題。所以建議大家宣告指標變數時一律給予初值。若無法在宣告的同時一併配置記憶體,那麼請給予NULL作為初值。例如:
TList *myList = NULL ;
另外,許多在delete後,大家可能也就不再理會該指標的內容了。其實,這也是會造成一些麻煩。因為記憶體被delete可能只是系統作一個記號在記憶配置表中,表示該記憶體是free的。原來的記憶體內還是有原先的內容。但是你的程式一個不注意,又去把原來的指標拿起來用。如果馬上就出錯的話,這樣還好。偏偏因為原來的內容都還在,所以這個錯誤會延遲產生影響。這種類型的Bug特別難抓!因為,你根本找不到引發問題的所在,如果你有個地方一直發生Access Violation,可是該地方的程式碼你已經check過十幾次了,還是找不問題,那很可能你就是遇到這樣的問題。以前在寫一些程式時,我就曾經為了這樣的Bug,弄了三天。可見其傷害有多大。
所以,當delete某指標後,其務必將其內容設為NULL。一方面是使用NULL指標,一定是馬上出錯。所以你的Bug一下就會抓到。另外一個
理由是如果你不小心重複delete同一個物件時,一樣會發生延遲影響的錯誤。
轉貼自: http://blog.xuite.net/huenlil/note/5290923
2011年2月18日 星期五
2011年2月10日 星期四
LACP timeout value problem? 改成short timeout為什麼反而是收到對方的LACPDU的timeout變短?
在LACP中timeout value只有兩種mode可以選,long以及short。long是30秒而short則是1秒。timeout value影響的是不同台間在維持LACP link時多久會去發一個packet去「確認」這條連線還是不是存在,如果不存在則在3倍timeout value後把這個port移出trunk group,而確認連線是否活著的packet通稱為LACPDU。
Reference:
[1] IEEE 802.3ad-2000
而目前有個問題意思是說當兩台DUT對接,當A台的timeout 設成1 sec而另外一台B維持default 30sec,去抓封包會發現B台會每隔1 sec發一次LACPDU的PACKET
反而A台還是原本的30sec去發LACPDU packet,好像有點怪怪的!?
經過查證後我們得到spec是寫說送LACPDU PACKET的timeout 時間是參考「對方的」timeout 時間,也意思是說當對方timeout設為1秒時候我們才會每1秒去發packet;反之則不會。
可以翻閱802.3a d-2000 p.133頁關於LACP中Tx state machine的描述:
LACP Periodic Tx Machine[1] |
可以看到標紅色的部份,當我們要送LACPDU的時候會根據Partner的timeout value
/* 在spec中actor代表的是自己;partner代表的是另外一台 */
另外,如果接DUT去接host,改了TIMEOUT為1sec後也是30sec才會收到LACPDU也是因為這個緣故。(partner的timeout value default都是30sec,當收到對方LACPDU時候跟現在timeout value不同才會去update)
Reference:
[1] IEEE 802.3ad-2000
訂閱:
文章 (Atom)