關於USES CONVERSION巨集

2021-08-25 19:46:38 字數 1760 閱讀 3570

首先,介紹下

uses_conversion

為何物。

uses_conversion

是atl

中的乙個巨集定義。用於編碼轉換(用的比較多的是

cstring

向lpcwstr

轉換)。通俗的說,就是用了這個巨集後,就可以用一系列的字串轉換巨集,有

ole到t,

t到ole,

ole到w,

w到ole等等,非常方便。或者說,這個巨集會告訴編譯器,在緊接的**中我們要用

ole庫中**(如

ansi

到unicode

的a2w(...))

的轉換巨集,不加

uses_conversion

在使用a2w

會出錯。

要想使用這個巨集,因為它是

atl庫帶的,所以要加上標頭檔案

#include 。

使用uses_conversion

一定要小心,它們從堆疊上分配記憶體,直到呼叫它的函式返回,該記憶體不會被釋放。如果在乙個迴圈中,這個巨集被反覆呼叫幾萬次,將不可避免的產生

stackoverflow。

在乙個函式的迴圈體中使用

a2w等字元轉換巨集可能會引起棧溢位。

#include

void fn()

} }

讓我們來分析以上的轉換巨集:

#define a2w(lpa) (\

((_lpa = lpa) == null) ? null : (\

_convert = (lstrlena(_lpa)+1),\

atla2whelper((lpwstr) alloca(_convert*2), _lpa, _convert)))

#define atla2whelper atla2whelper

inline lpwstr winapi atla2whelper(lpwstr lpw, lpcstr lpa, int nchars, uint acp)

關鍵的地方在

alloca

記憶體分配記憶體上。

#define alloca  _alloca

_alloca

allocates memory on the stack.

remarks

_alloca allocates size bytes from the program stack. the allocated space is automatically freed when the calling function

exits. therefore, do not pass the pointer value returned by _alloca as an argument to free.

問題就在這裡,分配的記憶體是在函式的棧中分配的。而

vc編譯器預設的棧記憶體空間是

2m。當在乙個函式中迴圈呼叫它時就會不斷的分配棧中的記憶體。

以上問題的解決辦法有兩個:

1. 自己寫字元轉換函式

function that safely converts a 'wchar' string to 'lpstr':

char* convertlpwstrtolpstr (lpwstr lpwszstrin)

} return pszout; }

2. 把字元轉換部分放到乙個函式中處理。

void fn2()

void fn()

} 如果不知道這點問題,在使用後崩潰時很難查出崩潰原因的。

關於程式關於世界

首先,在學了1年多的軟體設計的基礎上,問下自己 程式是什麼?業務需求是什麼?程式有什麼用?什麼是演算法?什麼是資料庫?或許每個人的理解不同,會給出不同的答案。那麼自己的理解 程式是乙個讓計算機工作的流程,在程式寫好之後,計算機就會按照,程式設計師定義好流程在執行。其實很多時候,乙個程式的好壞,在於乙...

關於血液關於軟體

1 自然沉降法 將血袋垂直吊掛於4 2 冰箱內,使紅細胞自然下沉1 3d,或將血袋呈70 80 角立於冰箱,需用時,用一次性分漿器分出血漿,制得濃縮紅細胞。2 洗滌法 一般用生理鹽水反覆洗滌3 6次。經洗滌的紅細胞,除白細胞和血小板減少外,血漿蛋白也極少,紅細胞中殘存的血漿蛋白含量約為原總蛋白的1 ...

關於冷漠,關於愛情

我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...