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;
}
들으을. 문자열 배열은 어떻습니까? –
문자열 배열은'StringToHGlobalAnsi()'에서 호출 한'AllocHGlobal()'의 메모리를 사용하고 있으므로 마찬가지입니다. 메모리를 확보하기 위해'StringToHGlobalAnsi()'에서 반환 된 IntPtr에'FreeHGlobal()'을 호출하면됩니다. 또한 IntPtr.Add()를 사용하여 문자열 예제에 대한 포인터 산술 연산을 수행해야합니다. –
FreeHGlobal에서 결과 포인터가 아닌 strPtr을 해제 할 필요가 있다는 것을 의미합니까? –