아마 C++ 프로그래머가 C++/CLI를 사용할 때 가장 신경 쓰이는 부분이 관리 코드를 어떻게 하면 비관리 코드와 연동하는 방법이라고 생각합니다.
그래서 아직 C++/CLI의 델리게이트 등 C++/CLI의 특징을 설명하지 않은 것이 많지만 이런 것은 C#를 공부하면 배울 수 있는 것이므로 급하지 않다고 생각합니다. 그래서 관리 코드와 비 관리 코드의 연동에 대해서 앞으로 몇 차례에 걸쳐서 설명하려고 합니다.
이번은 첫 번째로 간단하게 array로 만든 배열을 비관리 코드의 포인터로 어떻게 전달하는지 설명하겠습니다.
먼저 코드를 봐 주세요^^
#include <Iostream>
using namespace System;
void DumpNativeArray( int* pArrNums, int length )
{
for( int i=0; i<length; i++ )
{
std::cout << pArrNums[i] << std::endl;
}
}
int main()
{
array< int >^ ArrNums = gcnew array<int>(3);
ArrNums[0] = 1;
ArrNums[1] = 2;
ArrNums[2] = 3;
pin_ptr<int> pNative = &ArrNums[0];
DumpNativeArray(pNative,ArrNums->Length);
pNative = nullptr;
getchar();
return 0;
}
위 코드의 핵심은
pin_ptr<int> pNative = &ArrNums[0];
입니다.
앞서 설명한 pin_ptr을 사용하였습니다. pin_ptr을 사용하여 관리 힙에 할당된 객체가 이동하지 못하도록 고정합니다. 고정하는 이유는 비관리 코드로 메모리 주소를 넘기기 때문에 관리 힙에서 이동이 되면 안되기 때문입니다.
또 여기서 자세히 봐야 되는 것이 있습니다.
pNative에 &ArrNums이 아닌 &ArrNums[0]을 대입하였습니다. 이유는 관리 코드에서는 &ArrNums는 ArrNums의 요소가 아닌 ArrNums 오브젝트 자체를 가리키는 것이기 때문입니다.
&ArrNums[0]을 대입해야 ArrNums에 들어가 있는 요소의 첫 번째 주소를 비관리 코드에 주소를 넘길 수 있습니다.
제가 요즘 바빠서 이번은 아주 간단하게 이것으로 끝내겠습니다.^^;
다음에는 문자열 변환에 대해서 설명하겠습니다.
참조
http://mag.autumn.org/Content.modf?id=20050507224044
'C++/CLI' 카테고리의 다른 글
[Step. 06-2] 관리코드의 문자열과 비관리코드의 문자열 변환 (3) | 2010.07.23 |
---|---|
[Step. 06-1] 관리코드의 문자열과 비관리코드의 문자열 변환 (0) | 2010.07.16 |
[Step. 04] nullptr, interior_ptr, pin_ptr (2) | 2010.06.25 |
[step.03] 배열 (1) | 2010.06.18 |
[Step.02-2] 클래스(class), 핸들(^), 그리고 구조체(struct) (5) | 2010.06.11 |