社区
C#
帖子详情
C# 调用C++的DLL 后释放内存?
chenfan31
2011-08-04 03:40:28
C#程序调用C++编写的BLL中的方法,怎么是否这过程中占用的内存?是在C#中写,还是在C++的DLL中写?怎么写?
...全文
1112
13
打赏
收藏
C# 调用C++的DLL 后释放内存?
C#程序调用C++编写的BLL中的方法,怎么是否这过程中占用的内存?是在C#中写,还是在C++的DLL中写?怎么写?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
双子东宝
2013-09-10
打赏
举报
回复
解决了俺的问题。 非常感谢 chenfan31 的提问以及 sdl2005lyx 的回答。 谢谢!
火星大能猫
2011-08-05
打赏
举报
回复
[Quote=引用 5 楼 sdl2005lyx 的回复:]
2楼说的正确,这个问题需要比较深入了解,要想成功释放非托管代码分配的内存,必须先确定非托管代码的内存分配方式,才能在互操作是选择正确的方法释放非托管内存,
在非托管代码中,有3种分配方式:
1、C语言:malloc 、free
2、C++:new、delete
3、COM:CoTaskMenAlloc、CoTaskMenFree
第三种方式是互操作默认的释放非托管内存的方法!也……
[/Quote]
Good
bios8086
2011-08-04
打赏
举报
回复
海豚海豚!哈哈
sdl2005lyx
2011-08-04
打赏
举报
回复
在用C++写程序时,我们也会偶尔忘记free或delete了,只有这种情况不多,而且这部分代码运行时间不长,一般不会出现什么大问题。
但是,从程序严谨角度出发,建议楼主养成正确的内存分配,释放习惯。。。。
sdl2005lyx
2011-08-04
打赏
举报
回复
[Quote=引用 6 楼 chenfan31 的回复:]
非常感谢各位的回复,那如果我要是不是内存,一直调用C++中的方法,那么会照成C#程序死机吗
[/Quote]
主要会造成内存泄露,如果泄露太多,超过机器物理限制,这是肯定会崩掉。。。
sdl2005lyx
2011-08-04
打赏
举报
回复
一般不会,除非C++本身就存在问题!
chenfan31
2011-08-04
打赏
举报
回复
非常感谢各位的回复,那如果我要是不释放内存,一直调用C++中的方法,那么会照成C#程序死机吗
chenfan31
2011-08-04
打赏
举报
回复
非常感谢各位的回复,那如果我要是不是内存,一直调用C++中的方法,那么会照成C#程序死机吗
sdl2005lyx
2011-08-04
打赏
举报
回复
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);
//显示调用非托管释放内存函数释放内存,否则内存会泄露
杨友山
2011-08-04
打赏
举报
回复
应该在dll里写
chenfan31
2011-08-04
打赏
举报
回复
如果要写释放内存的方法,还得在C++的DLL里面些吧。还得在我们C#调用完DLL中的方法,再调用C++中释放内存的方法。是这样吗?
ChrisAK
2011-08-04
打赏
举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
如果是stdcall调用,就是由dll释放
如果是cdecl调用,就是谁调用谁释放
[/Quote]
那是恢复堆栈指针不是释放内存.释放内存和stdcall还是cdecl没关系 .
这个具体看设计了.一般提供出来调用的c++ 函数,应该提供释放的方法.
如果没有.只有碰运气了:win下大多数c++编译器产生的程序对使用malloc或 new
分配出的内存都是在系统默认堆上分配的.所以一般来说可以通过调用HeapFree函
数释放掉.但是如果释放的时候需要调用析构啥的(C++对象)...这个就无能为力了.
bdmh
2011-08-04
打赏
举报
回复
如果是stdcall调用,就是由dll释放
如果是cdecl调用,就是谁调用谁释放
C++
调用
C#
的
DLL
实例程序
C++
调用
C#
的
DLL
实例程序,压缩包中包含部分程序说明,很小的几行代码,但是C++
调用
C#
的
DLL
目的已经达到。
C#
调用
c++工程文件(调试已通过)
C#
调用
c++工程文件
C#
调用
c++工程文件
C#
调用
c++工程文件
C#
调用
c++工程文件
C#
调用
c++工程文件
C#
调用
c++工程文件
C#
调用
c++工程文件
C#
调用
c++工程文件
C#
调用
C/C++
Dll
中函数实例代码
实例代码说明如何在托管的
C#
代码中
调用
非托管的Win32 API或者自己用C/C++写的
Dll
中的函数,以及如何传递输入、输出字符串参数,结构类型参数等问题。
C#
调用
C++
DLL
时
释放
非托管
内存
C#
调用
C++
DLL
时
释放
非托管
内存
C#
调用
C++的
dll
方法
C#
调用
C++的
dll
总归可以有两种方法: 1、非托管C++创建的
dll
库,需要用静态方法
调用
; 2、直接使用CLR,生成托管C++
dll
库。
C#
110,570
社区成员
642,565
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章