托管内存的一点疑问

walk121 2008-08-06 03:29:27
c++写了一个函数,通过dll导出后供c#调用。
void writeMem(int* pMem)
{
pMem[1...n] = 0;
……
}

在c#中,声明:
public static extern void writeMem(int[] pMem);


调用:
int[] pMem = new int[50];
writeMem(pMem);

那c#的GC会不会在执行writeMem的时候进行回收,造成内存错误?
...全文
203 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
upUP_loving1984 2008-08-06
  • 打赏
  • 举报
回复
ding...
LQknife 2008-08-06
  • 打赏
  • 举报
回复
晓习
cn_duoduo 2008-08-06
  • 打赏
  • 举报
回复
楼上说的很好
gomoku 2008-08-06
  • 打赏
  • 举报
回复
这样做是安全的。原因是在P/Invoke的时候,CLR帮你把int[] pMem登记为不可移动,不回收的对象,直到调用完毕。

不过,如果C++保存了传入的指针,并在以后对该指针进行操作,那么你的担忧是对的。这时可以显式的钉住托管内存:

GCHandle gc = GCHandle.Alloc(pMem , GCHandleType.Pinned);

// 调用非托管代码
// ...
// 非托管代码使用指针
// ...


// 告诉CLR现在可以回收pMem,可以移动pMem
gc.Free();
greystar 2008-08-06
  • 打赏
  • 举报
回复
不会,只管托管的.非托管的要自己去处理.

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧