十年前用c++玩會opc client後就一直想玩server,但因工作原因一直沒有使用的機會和緊迫感,也因為其難度,就一直擱置著。年後因為新的工作原因,必須搞會opc server。自知年紀大了,從頭啃com技術幾乎是不可能,使用網上現成的dll又擔心不穩定或是出問題後不知如何查故障。後從**子**得到了lightopc的原始碼,便花了半個月啃下了這個,雖然已經是15年前的技術,但依然光彩閃耀。
剛給客戶移交了個opcserver,突然忘了測試是否記憶體洩漏情況,趕緊重測一遍。糟糕,載入變數時每個變數都報一次「access in invalid memory: attempt to access 1 byte(s) at 0x00000000.」追蹤到是
mbstowcs(0x00000000, 0x03e1fd3c ["htdopc.bianliang01"], 0x13 [19])
typedef wchar lowchar;
static void *trm[8000];
static unsigned tra;
#define sizeof_array(x) (sizeof(x)/sizeof(x[0]))
long mallocx_count = -1;
void trap_alloc(void *buf)
else
mallocx_count++;
}int lo_mbstowcs(lowchar *wcs, const char *mbs, int nn)
/* if (wcs && ii < len) wcs[ii] = 0;*/
return ii;
}void *mallocx(unsigned size)
lowchar *lomwstrdup(const char *str)
return ns;
}
為了便於重新除錯,以上**是節選。
測試**:
char x[24]="abcd0123";
wchar *y=lomwstrdup(x));
不開啟記憶體檢測時,執行正常,已開啟記憶體檢測就定位到了
ii = mbstowcs(wcs, mbs, nn);//wcs 引數為0即報記憶體故障
查了下 mbstowcs原型,size_t
mbstowcs(
wchar_t
*dest, const char *src, size_t n);
特意註明了:
如dest 非null,則mbstowcs() 函式把多字元src轉換成寬字元dest,最多轉換到n個寬字元(即wchar_t);
如dest為null,則忽略引數n,轉換仍然繼續,只是不寫到dest,最終返回轉換成功的寬字元個數(不包括終止符'\0')。
原作者真巧妙,第一次獲取需要的記憶體大小,第二次再轉換,還特意註明
never returns -1
學藝不精,虛驚一場! Qt 記憶體洩漏測試
在說qt的記憶體測試之前,首先需要說明和肯定的一點是 qt是絕對沒有記憶體洩漏的,我們必須相信這一點。接下來,說明一下基於linux的qt記憶體測試工具及其用法和說明 一 記憶體測試工具valgrind 安裝就不具體說了,網上一堆堆的 二 用法 安裝完valgrind之後,開啟qt creator,...
記憶體洩漏 1 記憶體洩漏概念與測試工具介紹
序言 2018年5月的時候,因為工作需要專門去研究了記憶體洩漏。主要是要去檢測linux c專案 以及python 對linux c的記憶體洩漏檢測可能還比較熟悉,但是對指令碼語言python進行記憶體洩漏的測試,我一開始表示完全不知情,隨著查詢資料,才逐漸明朗。所以這個記憶體洩漏版塊,主要為了記錄...
記憶體洩漏和記憶體溢位 記憶體洩漏和記憶體溢位
記憶體洩漏 是指申請的記憶體空間使用完畢之後未 一次記憶體洩露危害可以忽略,但若一直洩漏,無論有多少記憶體,遲早都會被占用光,最終導致程式crash。因此,開發中我們要盡量避免記憶體洩漏的出現 記憶體溢位 是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用。通俗理解就是記憶體不夠用了,通常在執行大...