2013-06-12 5 views
0

관리되지 않는 코드와 함께 사용할 구조체 배열을 가리키는 IntPtr을 할당합니다.관리되지 않는 배열을 가리키는 IntPtr을 올바르게 해제하는 방법은 무엇입니까?

public IntPtr ArrayToPtr<T>(T[] array) 
{ 
    int size = array.Length; 
    int elemSize = Marshal.SizeOf(typeof(T)); 

    IntPtr result = Marshal.AllocHGlobal(elemSize * size); 

    for (int i = 0; i < size; i++) 
    { 
     IntPtr ptr = new IntPtr(result.ToInt64() + elemSize * i); 
     Marshal.StructureToPtr(array[i], ptr, false); 
    } 

    return result; 
} 

을 이제 내 질문 :

  • 어떻게 제대로 확보이 IntPtr입니다 포인터를 초래하는 내 마지막 방법은 (잘 작동하는 것 같다) 여기에이 주제에 자원을 많이 발견? (FreeHGlobal (포인터)로 충분합니까?)
  • x86 또는 x64 시스템/응용 프로그램 플랫폼을 사용하는 경우 예방 조치가 있습니까? 문자열 배열 (C에서 문자 **)에 대한

같은 질문 :

public IntPtr ArrayOfStringToPtr(string[] array) 
{ 
    int size = array.Length; 
    int elemSize = IntPtr.Size; 

    IntPtr result = Marshal.AllocHGlobal(elemSize * size); 

    for (int i = 0; i < size; i++) 
    { 
     IntPtr strPtr = Marshal.StringToHGlobalAnsi(array[i]); 
     Marshal.StructureToPtr(strPtr, new IntPtr(result.ToInt64() + elemSize * i), false); 
    } 

    return result; 
} 

답변

1

예, 당신은 당신이 메모리 사용을 마친 후 Marshal.FreeHGlobal(hglobal)를 호출해야합니다.

당신이 IntPtr 당신을 위해 포인터의 크기의 차이을 담당하기 때문에 자동 x86에서 또는 x64 플랫폼을 작동 IntPtr을 사용하고 있기 때문에.

그러나 포인터 계산을 수행하려면 ToInt64()을 사용하지 않아야합니다.

대신

IntPtr ptr = new IntPtr(result.ToInt64() + elemSize * i); 

의이 작업을 수행 :

IntPtr ptr = IntPtr.Add(result, elemSize * i); 
+0

들으을. 문자열 배열은 어떻습니까? –

+0

문자열 배열은'StringToHGlobalAnsi()'에서 호출 한'AllocHGlobal()'의 메모리를 사용하고 있으므로 마찬가지입니다. 메모리를 확보하기 위해'StringToHGlobalAnsi()'에서 반환 된 IntPtr에'FreeHGlobal()'을 호출하면됩니다. 또한 IntPtr.Add()를 사용하여 문자열 예제에 대한 포인터 산술 연산을 수행해야합니다. –

+0

FreeHGlobal에서 결과 포인터가 아닌 strPtr을 해제 할 필요가 있다는 것을 의미합니까? –