在C#中,如何删除由C分配的指针?

在C#中,如何删除由C分配的指针?,c#,pinvoke,C#,Pinvoke,在c#中,使用p/Inovke调用此函数: #define EXPORT_DLL extern "C" __declspec(dllexport) EXPORT_DLL int* alloc(int size) { int* result = new int[size]; return result; } 然后,创建一个测试,如: public class Model { [DllImport("Win32Project1.dll", EntryPoint = "a

在c#中,使用p/Inovke调用此函数:

#define EXPORT_DLL extern "C" __declspec(dllexport) 

EXPORT_DLL int* alloc(int size)
{
    int* result = new int[size];
    return result;
}
然后,创建一个测试,如:

public class Model
{
    [DllImport("Win32Project1.dll", EntryPoint = "alloc", CallingConvention = CallingConvention.Cdecl)]
    extern static IntPtr Alloc(int size);

    public int[] Data { get; set; }

    public Model(int size)
    {
        IntPtr ptr = Alloc(size);
        Data = new int[size];
        Marshal.Copy(ptr, Data, 0, Data.Length);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
列表=新列表();
列表.添加(新型号(10240000));
列表.添加(新型号(10240000));
列表.添加(新型号(10240000));
列表.添加(新型号(10240000));
列表.添加(新型号(10240000));
list.Clear();
GC.Collect();
}
}

但是,当GC.Collect()执行时,只收集托管内存。那么有没有办法释放c函数分配的内存呢?

您正在创建的c API需要公开一个.NET代码可以调用的释放函数

在C/C++中分配内存的方式太多了(例如,
new
malloc
GlobalAlloc
,…)只需一个
Marshall。删除
即可。因此,将匹配的释放添加到要从.NET调用的本机代码中


(在.NET方面,最好是专门研究自动调用该释放函数。)

您正在创建的C API需要公开一个.NET代码可以调用的释放函数

在C/C++中分配内存的方式太多了(例如,
new
malloc
GlobalAlloc
,…)只需一个
Marshall。删除
即可。因此,将匹配的释放添加到要从.NET调用的本机代码中


(在.NET方面,最好是专门研究自动调用该释放函数。)

您正在创建的C API需要公开一个.NET代码可以调用的释放函数

在C/C++中分配内存的方式太多了(例如,
new
malloc
GlobalAlloc
,…)只需一个
Marshall。删除
即可。因此,将匹配的释放添加到要从.NET调用的本机代码中


(在.NET方面,最好是专门研究自动调用该释放函数。)

您正在创建的C API需要公开一个.NET代码可以调用的释放函数

在C/C++中分配内存的方式太多了(例如,
new
malloc
GlobalAlloc
,…)只需一个
Marshall。删除
即可。因此,将匹配的释放添加到要从.NET调用的本机代码中

(在.NET方面,最好考虑专门化以自动调用该释放函数。)

class Program
{
    static void Main(string[] args)
    {

        List<Model> list = new List<Model>();

        list.Add(new Model(10240000));
        list.Add(new Model(10240000));
        list.Add(new Model(10240000));
        list.Add(new Model(10240000));
        list.Add(new Model(10240000));
        list.Clear();
        GC.Collect();

    }
}