2013-03-28 1 views
0

C++/CLI 함수에 대한 .NET 래퍼 클래스를 만듭니다. 내부적으로이 함수는 int 배열 (int*)을 사용하지만 .NET 측에서 깨끗한 List<int>^을 노출하고 싶습니다. 다음 코드를 사용하여 C# List를 int의 C++ 비 관리 목록으로 변환합니다.목록을 C++/CLI의 관리되지 않는 배열로 변환

Marshal::FreeHGlobal을 사용하여 할당 된 메모리를 해제하지 않는다는 것 외에도이 기능에 문제가 있습니까? 예를 들어 배열 길이 바이트에 ((count * 4) + 4)을 할당해야합니까?

static int* ListToArray(List<int>^ list){ 

    // new array 
    int count = list->Count; 
    int* arr = (int*)(Marshal::AllocHGlobal(count * 4).ToPointer()); 

    // convert list to array 
    for(int a = 0; a < count; a++){ 
     arr[a] = list[a]; 
    } 
    return arr; 
} 

답변

2

코드가 정확합니다. 올바른 양의 메모리를 할당합니다. 4 대신 sizeof int을 사용하면 더 표현력이 좋습니다.

저는 왜 AllocHGlobal을 사용하는지 궁금합니다. 나는 new이 C++ 코드에서 더 적절할 것이라고 생각한다. 그리고 왜 원시 포인터를 사용하는지 궁금합니다. std::vector<int>은 C++ 코드에서 더 이해할 수 없습니까?

관련 문제