C ++ / CLI에서 캐럿 ( '^')은 무엇을 의미합니까?


212

방금이 코드를 발견했으며 몇 가지 Google 검색 에서이 신비한 (나에게) 구문에 대한 설명을 얻지 못했습니다.

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

캐럿은 무엇을 의미합니까? ( gcnew또한 나에게도 새롭고 여기 에 대해 물었 습니다 .)


6
그건 그렇고, 그것은 "모자"로 발음 됩니다.
kmote

답변:


176

이것은 C ++ / CLI 이며 캐럿은 * (포인터)와 동일하게 관리됩니다 .C ++ / CLI 용어 에서 '참조 유형'에 대한 '핸들' 이라고합니다 (관리되지 않는 포인터를 가질 수 있기 때문에).

더 나은 용어를 지적 해 준 Aardvark에게 감사합니다.


5
C ++ / CLI에 ( "관리되지 않는 참조"라고 가정) 구문 "&"이 여전히 존재합니까?
Owen

C ++ / CLI는 일반 C ++의 확장이므로 예-관리되지 않는 참조 용입니다.
1800 INFORMATION

77
// here normal pointer
P* ptr = new P; // usual pointer allocated on heap
P& nat = *ptr; // object on heap bind to native object

//.. here CLI managed 
MO^ mngd = gcnew MO; // allocate on CLI heap
MO% rr = *mngd; // object on CLI heap reference to gc-lvalue

일반적으로 문장 부호 %^문장 부호 &와 동일합니다 *. C ++에서 단항 &연산자는 C ++ / CLI에서 단항 %연산자입니다.

&ptra P*%mngd산출 하지만에 산출합니다 MO^.


1
오히려 * mngd 대신 ^ mngd가 아닌 이유를 말하고 싶습니다. 관리 힙에 선언 된 실제로 변수 앞에 관리 포인터 (^)가 아닌 관리되지 않는 포인터 기호 (*)를 사용하는 것이 갑자기 혼란 스럽습니다.
swcraft

20

이는 관리 대상 개체와 일반 C ++ 포인터에 대한 참조임을 의미합니다. 이러한 참조 뒤에있는 오브젝트는 런타임에 의해 관리되며 메모리에서 재배치 될 수 있습니다. 또한 자동으로 가비지 수집됩니다.


17

관리 메모리를 할당하면 가비지 수집기에서 해당 메모리를 이동할 수 있습니다. ^ 연산자는 관리되는 메모리에 대한 포인터이며 가비지 수집기가 가리키는 개체를 이동하더라도 올바른 위치 를 계속 가리 킵니다.




당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.