小编Emr*_*ZCU的帖子

空闲内存不会清除内存块

我正在使用DllImport从我自己的.net类中调用c包装器库中的方法.c dll中的此方法创建一个字符串变量并返回该字符串的指针.

像这样的东西;

_declspec(dllexport) int ReturnString()
{
 char* retval = (char *) malloc(125);
 strcat(retval, "SOMETEXT");
 strcat(retval, "SOMETEXT MORE");
 return (int)retval;
}
Run Code Online (Sandbox Code Playgroud)

然后我使用Marshall.PtrToStringAnsi(ptr)读取字符串.在我得到字符串的副本后,我只需调用另一个c方法HeapDestroy,该方法位于调用free(ptr)的c包装器库中.

这是个问题; 最近虽然它像魅力一样工作,但我开始"尝试读取或写入受保护的内存区域"例外.经过深入分析,我想通了,我相信,虽然我为这个指针调用了自由方法,指针的值没有被清除,并且这填充了无人看管的堆并使我的iis工作进程抛出此异常.顺便说一句,它是一个在c库中调用此方法的网站项目.

你能帮我解决这个问题吗?

当然,这是C#代码;

    [DllImport("MyCWrapper.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    private extern static int ReturnString();

    [DllImport("MyCWrapper.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    private extern static void HeapDestroy(int ptr);

    public static string GetString()
    {
        try
        {

            int i = ReturnString();
            string result = String.Empty;
            if (i > 0)
            {
                IntPtr ptr = new IntPtr(i);
                result = Marshal.PtrToStringAnsi(ptr);
                HeapDestroy(i); …
Run Code Online (Sandbox Code Playgroud)

c c# pinvoke dllimport

1
推荐指数
1
解决办法
1081
查看次数

标签 统计

c ×1

c# ×1

dllimport ×1

pinvoke ×1