淺談C#互操作的內(nèi)存溢出問題
c#調(diào)用C++DLL代碼,發(fā)現(xiàn)了一個(gè)隱藏很深的問題。 危害很大,而且不易察覺。
大概是申明c++的函數(shù)時(shí)候,有一個(gè)long類型的指針。在C#中我的申明成了這樣:
public extern void Method(ref uint para);
最初怎么也沒有發(fā)現(xiàn)這里面有什么問題,知道這個(gè)隱藏的問題暴露出來,把前面申明的一個(gè)變量改變了, 我才恍然大悟。
uint test = 0;
int *p = new IntPtr();
Method(ref test);
在調(diào)用Method這里下斷點(diǎn),p的值是分配的一個(gè)內(nèi)存地址。F10跳過Method,p指針就指向了0x00000000!!;
初步分析,是在棧上只給test分配了4個(gè)字節(jié)存放值,結(jié)果通過互操作返回了8個(gè)字節(jié)的值,就把緊挨著的存放p指針地址的4個(gè)字節(jié)占用了,恰好這四個(gè)字節(jié)又是高位,返回?cái)?shù)據(jù)的高位都是0。 以前了解過c++的棧內(nèi)存溢出,沒想到在c#里被我遇到了,問題看似不大,如何被恰好相鄰的四個(gè)字節(jié)是返回地址,說不定危害不小?。?! 看來c#的互操作還是得小心為好。
相關(guān)文章
Qt實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼
本文主要介紹了Qt實(shí)現(xiàn)網(wǎng)絡(luò)聊天室,實(shí)現(xiàn)一個(gè)在線聊天室, 使用tcp對(duì)客戶端和服務(wù)器端進(jìn)行通訊。具有一定的參考價(jià)值,具有一定的參考價(jià)值,2021-06-06
java 中ArrayList與LinkedList性能比較
這篇文章主要介紹了java 中ArrayList與LinkedList性能比較的相關(guān)資料,需要的朋友可以參考下2017-03-03
c++中strcpy函數(shù)在VS2015無法使用的問題
這篇文章主要介紹了c++中strcpy函數(shù)在VS2015無法使用的問題,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11
c++ 對(duì)數(shù)器實(shí)現(xiàn)示例
對(duì)數(shù)器用于在自己的本地平臺(tái)驗(yàn)證算法正確性,本文詳細(xì)的介紹了c++ 對(duì)數(shù)器實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
C++實(shí)現(xiàn)類似延時(shí)停頓的打字效果
這篇文章主要介紹的是使用C++實(shí)現(xiàn)類似延時(shí)停頓的打字效果的代碼,非常的簡單,推薦給大家,有需要的小伙伴可以參考下。2015-03-03

