C#程序调用C++编写的BLL中的方法,怎么是否这过程中占用的内存?是在C#中写,还是在C++的DLL中写?怎么写?

解决方案 »

  1.   

    如果是stdcall调用,就是由dll释放
    如果是cdecl调用,就是谁调用谁释放
      

  2.   

    那是恢复堆栈指针不是释放内存.释放内存和stdcall还是cdecl没关系 .这个具体看设计了.一般提供出来调用的c++ 函数,应该提供释放的方法.
    如果没有.只有碰运气了:win下大多数c++编译器产生的程序对使用malloc或 new
    分配出的内存都是在系统默认堆上分配的.所以一般来说可以通过调用HeapFree函
    数释放掉.但是如果释放的时候需要调用析构啥的(C++对象)...这个就无能为力了.
      

  3.   

    如果要写释放内存的方法,还得在C++的DLL里面些吧。还得在我们C#调用完DLL中的方法,再调用C++中释放内存的方法。是这样吗?
      

  4.   

    2楼说的正确,这个问题需要比较深入了解,要想成功释放非托管代码分配的内存,必须先确定非托管代码的内存分配方式,才能在互操作是选择正确的方法释放非托管内存,
    在非托管代码中,有3种分配方式:1、C语言:malloc 、free
    2、C++:new、delete
    3、COM:CoTaskMenAlloc、CoTaskMenFree第三种方式是互操作默认的释放非托管内存的方法!也就是说,采用前两种方式分配的非托管内存,托管代码不能正确释放,必须由非托管方自己明确释放:
    C++:
    wchar_t* GetStringNew()
    {
    int iBufferSize = 128;
    wchar_t* pBuffer = new wchar_t[iBufferSize ];
    if(NULL != pBuffer)
    {
    wcscpy_s(pBuffer, iBufferSize/sizeof(wchar_t), L"String from New");
    }
    return pBuffer;
    }void FreeNewMemory(void* pBuffer)
    {
    printf("\n%d", pBuffer);
    if(NULL != pBuffer)
    {
    delete pBuffer;
    pBuffer = NULL;
    }
    }C#:
    [DllImport("NativeLib.dll", 
                CallingConvention = CallingConvention.Cdecl, 
                CharSet = CharSet.Unicode )]
       static extern string GetStringNew();
     [DllImport("NativeLib.dll", 
                CallingConvention = CallingConvention.Cdecl, 
                CharSet = CharSet.Unicode            )]
      static extern void FreeNewMemory(IntPtr pbuffer);IntPtr strPtr=GetStringNew();
    string str=Marshal.PtrToStringUni(strPtr);
    FreeNewMemory(strPtr);   //显示调用非托管释放内存函数释放内存,否则内存会泄露
      

  5.   

    在用C++写程序时,我们也会偶尔忘记free或delete了,只有这种情况不多,而且这部分代码运行时间不长,一般不会出现什么大问题。但是,从程序严谨角度出发,建议楼主养成正确的内存分配,释放习惯。
      

  6.   

    解决了俺的问题。非常感谢  chenfan31 的提问以及 sdl2005lyx 的回答。
    谢谢!