内存泄漏调用C#中的C函数

时间:2015-01-23 08:15:59

标签: c# c memory-leaks interop

我在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;
}

0 个答案:

没有答案