内存溢出 浅谈C#互操作的内存溢出问题
人气:0想了解浅谈C#互操作的内存溢出问题的相关内容吗,在本文为您仔细讲解内存溢出的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:内存溢出,下面大家一起来学习吧。
c#调用C++DLL代码,发现了一个隐藏很深的问题。 危害很大,而且不易察觉。
大概是申明c++的函数时候,有一个long类型的指针。在C#中我的申明成了这样:
public extern void Method(ref uint para);
最初怎么也没有发现这里面有什么问题,知道这个隐藏的问题暴露出来,把前面申明的一个变量改变了, 我才恍然大悟。
复制代码 代码如下:
uint test = 0;
int *p = new IntPtr();
Method(ref test);
在调用Method这里下断点,p的值是分配的一个内存地址。F10跳过Method,p指针就指向了0x00000000!!;
初步分析,是在栈上只给test分配了4个字节存放值,结果通过互操作返回了8个字节的值,就把紧挨着的存放p指针地址的4个字节占用了,恰好这四个字节又是高位,返回数据的高位都是0。 以前了解过c++的栈内存溢出,没想到在c#里被我遇到了,问题看似不大,如何被恰好相邻的四个字节是返回地址,说不定危害不小啊!! 看来c#的互操作还是得小心为好。
加载全部内容