C#程序调用C++编写的BLL中的方法,怎么是否这过程中占用的内存?是在C#中写,还是在C++的DLL中写?怎么写?
解决方案 »
- drawString 出现黑边 怎么解决
- 怎么使用Control.SetStyle
- ListView虚模式下如何异步刷新?
- 跨线程调用 主窗体不显示
- c#中的事件和委托
- 求一个简单问题,,,急
- 100分相送解决WebBrowser的问题
- 能不能给一个没有双击事件的ActiveX控件添加双击事件啊
- 提一个关于图片的问题,我想了好久找不到解决方法,希望有GG能帮忙????????
- 追回所爱:急求,福州、厦门的IT职位,帮忙提供两个地区的公司资料~~撒尽热血~跪求各位友情UP—— ~~撒尽热血~~撒尽热血~~撒尽热血
- 对于当前进程,如何判断所属用户名是不是SYSTEM
- WinForm 关于安装包里的Ocx自动注册的问题
如果是cdecl调用,就是谁调用谁释放
如果没有.只有碰运气了:win下大多数c++编译器产生的程序对使用malloc或 new
分配出的内存都是在系统默认堆上分配的.所以一般来说可以通过调用HeapFree函
数释放掉.但是如果释放的时候需要调用析构啥的(C++对象)...这个就无能为力了.
在非托管代码中,有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); //显示调用非托管释放内存函数释放内存,否则内存会泄露
谢谢!