如果我有一个返回char*的c++函数,如下所示:
char *cctalk_app_event_name(DG_CCTALK_APP_EVT_CODE);以及相应的C#签名:
[System.Runtime.InteropServices.DllImportAttribute("cctalk.dll", EntryPoint = "cctalk_app_event_name", CallingConvention = CallingConvention.Cdecl)]
public static extern System.IntPtr cctalk_app_event_name(DG_CCTALK_APP_EVT_CODE param0);如果本机代码返回一个用新关键字分配的char*,那么每次调用这个函数C#时,我肯定会有一个内存泄漏。有什么办法让我释放记忆吗?
发布于 2013-11-29 22:52:11
通过查看函数名,我的预感是,这很可能是将指针返回到DLL中的字符串常量,在这种情况下,您不需要担心释放指针。
如果SDK手册(链接在这里)没有任何用处,那么我将拆解DLL并查看该函数做了什么,但是在确定需要之前,不要担心如何删除它。
发布于 2013-11-29 22:53:41
如果您没有任何文档或源,那么您就无法知道内存是否分配给了new。如果它是用new分配的,那么需要用delete解除它的分配。这只能从本机代码中执行。如果需要这样做,则DLL将需要为您导出一个代理程序。
其他可能性包括来自共享堆的分配,例如COM堆。不太可能。或者,字符串是静态分配的,不需要取消分配。当函数返回C字符串作为返回值时,通常是这样的。如果你不得不猜的话,那就是百分比选项。在任何情况下,如果您无法释放字符串,您还能做什么?
唯一可以确定的方法是获得文档、源代码或作者的支持。我感谢你想知道解决办法,但你唯一的希望是这一段第一句所列的选择。
我很难相信这个复杂的图书馆没有文档。你是怎么经过这个图书馆的?你真的确定没有文档吗?
https://stackoverflow.com/questions/20294036
复制相似问题