我在C#中使用C dll函数。它工作正常,除了我有内存泄漏。
我使用的第一个C函数分配内存(使用malloc)并返回一个字符串数组(char ***),第二个函数释放内存(使用free)。
当我在C程序中测试这些函数时,一切正常 - 没有内存泄漏。但是,当我在C#程序中使用这些函数时,我有内存泄漏。
我确定我做的事情很糟糕,但我无法弄清楚是什么。
我的代码:
[DllImport("TestERP.dll", CallingConvention = CallingConvention.StdCall)]
private static extern int GetArray(string baseval,ref int nb,ref IntPtr array,IntPtr msg);
[DllImport("TestERP.dll", CallingConvention = CallingConvention.StdCall)]
private static extern int freeMemory( int nb, ref IntPtr array);
public static void GetManagedArray()
{
string[] tmp = new string[12];
int nb = 0;
IntPtr msg = Marshal.AllocHGlobal(256);
string tmp2 = "";
IntPtr intArr = IntPtr.Zero;
//call the C function which return the arry of string intArr
GetArray("val",ref nb, ref intArr,msg);
//copy in managed string array
for (int i = 0; i < nb; i++)
tmp[i] = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(intArr, i * IntPtr.Size));
tmp2 = Marshal.PtrToStringAnsi(msg);
Marshal.FreeHGlobal(msg);
//call the C function whiec free memory
freeMemory(nb, ref intArr);
intArr = IntPtr.Zero;
GC.Collect();
}
我添加了C函数的代码:
int __stdcall GetArray(char base[],int* nb,char*** array,char* outmsg)
{
int i =0;
(*array) = (char**)calloc(12, sizeof(char*));
for (i = 0; i < 12; i++)
{
(*array)[i] = calloc(256,sizeof(char));
sprintf((*array)[i],"%s %d",base,i) ;
}
*nb= 12;
strcpy(outmsg,"message erreur");
return 0;
}
int __stdcall freeMemory(int nb,char*** array)
{
int i =0;
for (i = 0; i < nb; i++)
{
free((*array)[i]);
(*array)[i] = 0;
}
free((*array));
*array = 0;
return 0;
}