intptr p = cfunction();
//cfunction方法是个非托段代码  vc6.0生成的  申请了100字节的内存然后将这片内存的首地址返回
//那么我想要在c#释放这片内存应该怎么写Marshal.FreeBSTR(p);
Marshal.FreeHGlobal(p);//以上两种方法都不对
我一开始的想法是用vc再写一个方法,接受一个参数也就是p   然后由vc自己去释放这片内存区
但是我用c#调用这个方法时会不定期的报错,不知道为什么
其实我想问的是c#调用非托管代码的机制是什么,dll的生存期是调用者的生存期还是调用一次以后就释放,望不吝赐教顺便问问我c#释放非托管代码申请的内存会不会有什么其它的问题

解决方案 »

  1.   

    cfunction里面是怎么分配的内存?
    如果是用的malloc或c++默认的new,可以使用HeapFree API函数使用默认堆释放
      

  2.   

    Marshal.ReleaseComObject(..)?不知道可以不
      

  3.   

    使用那个的前提是cfunction 返回的是一个IUnknown*
      

  4.   

    即使同是 malloc, 不同版本的 crt , 也不可乱用.
      

  5.   

    主要看vb6是怎么申请的那段内存?我觉得还是应该用vb6写个程序去释放,因为vb6的runtime跟vc的也许不同(应该是不同,vb貌似非纯PE),所以最好是谁申请的找谁释放,这样安全些。
      

  6.   

    当你调用非托管代码,其运行在另一个进程内存空间,CLR不管的,所以你应该在非托管代码内释放空间。