在C#中,如何删除由C分配的指针?
在c#中,使用p/Inovke调用此函数:在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
#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();
}
}