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

