2013-03-24 28 views
5

在托管代码中分配内存使用:如何在非托管内存中分配IntPtr []的数组?

IntPtr [] params_list_n = new IntPtr [5]; 

但对于非托管内存我使用Marshal.AllocHGlobal 我不明白怎么回事,在这种情况下,为数组分配内存。

理想情况下,我想使用函数调用Marshal.GetNativeVariantForObject (o, params_list_n[i]); 对于数组的每个元素。

回答

6

使用Marshal.AllocHGlobal创建非托管内存很简单。

IntPtr pointer = Marshal.AllocHGlobal(1024); 

如果您需要计算可以使用的空间量Marshal.SizeOf

int size = Marshal.SizeOf(typeof(IntPtr)); 
IntPtr pointer = Marshal.AllocHGlobal(size); 

您还需要在项目中启用unsafe code才能运行。

  1. 右键点击你的项目并选择Properties
  2. 打开Build选项卡。
  3. 选择Allow unsafe code
+0

谢谢。告诉我更多如何将内存从非托管复制到非托管。 Marshal.Copy不适合这个目的。我认为 – Mixer 2013-03-24 22:51:51

2

该数组将是一个指向元素的指针。你可以用同样的方法:

IntPtr results = Marshal.AllocHGlobal(5 * IntPtr.Size); 
+1

* sizeof *不能与IntPtr一起使用! – Mixer 2013-03-24 22:42:13

+1

@Mixer固定 - 对不起,快速去过 – 2013-03-24 22:47:33

+1

我忘记了'IntPtr.Size'。荣誉。 :) – eandersson 2013-03-24 22:48:16

相关问题