2013-03-24 40 views
5

Để cấp phát bộ nhớ trong quản lý mã tôi sử dụng:Làm thế nào để phân bổ mảng IntPtr [] trong bộ nhớ không được quản lý?

IntPtr [] params_list_n = new IntPtr [5]; 

Nhưng đối với bộ nhớ không được quản lý tôi sử dụng Marshal.AllocHGlobal Và tôi không hiểu tại sao, trong trường hợp này để cấp phát bộ nhớ cho mảng.

Lý tưởng nhất là tôi muốn sử dụng lệnh gọi hàm Marshal.GetNativeVariantForObject (o, params_list_n[i]); Đối với mỗi phần tử của mảng.

Trả lời

6

Tạo bộ nhớ không được quản lý sử dụng Marshal.AllocHGlobal thật đơn giản.

IntPtr pointer = Marshal.AllocHGlobal(1024); 

Nếu bạn cần tính toán dung lượng bạn có thể sử dụng Marshal.SizeOf.

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

Bạn cũng cần phải kích hoạt unsafe code trong dự án của mình để điều này chạy.

  1. Nhấp chuột phải vào dự án của bạn và chọn Properties.
  2. Mở tab Build.
  3. Chọn Allow unsafe code.
+0

Cảm ơn bạn. Cho tôi biết cách sao chép bộ nhớ từ không được quản lý sang không được quản lý. Marshal.Copy không phù hợp cho mục đích này. Như tôi hiểu – Mixer

2

Mảng sẽ là con trỏ đến các phần tử. Bạn sử dụng nó theo cùng một cách:

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

* sizeof * không hoạt động với IntPtr! – Mixer

+1

@Mixer cố định - xin lỗi, đã nhanh chóng –

+1

Tôi quên về 'IntPtr.Size'. Thanh danh. :) – eandersson

Các vấn đề liên quan