Owen
Owen

Reputation: 7784

What does the caret (‘^’) mean in C++/CLI?

I just came across this code and a few Google searches turn up no explanation of this mysterious (to me) syntax.

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

What the heck does the caret mean? (The gcnew is also new to me, and I asked about that here.)

Upvotes: 263

Views: 126077

Answers (8)

DennisVM-D2i
DennisVM-D2i

Reputation: 490

It's also worth considering the following couple of sentences, that put the answer in a slightly different way:

"The handle declarator (^, referred to as "caret" or "hat" or "circumflex"), modifies the type specifier to mean that the declared object should be automatically deleted when the system determines that the object is no longer accessible."

"Because native C++ pointers (*) and references (&) are not managed references, the garbage collector cannot automatically update the addresses they point to. To solve this problem, use the handle declarator to specify a variable that the garbage collector is aware of and can update automatically."

(And "native" is in my humble opinion a better word than 'handle', as handle is possibly a word that was brought more so in by the use of the 'Windows SDK')

Upvotes: 0

Joel Coehoorn
Joel Coehoorn

Reputation: 415840

When you allocated managed memory, that memory can be moved around by the garbage collector. The ^ operator is a pointer for managed memory which continues to point to the correct place even if the garbage collector moves the object it points to.

Upvotes: 22

Rob Walker
Rob Walker

Reputation: 47462

This is C++/CLI and the caret is the managed equivalent of a * (pointer) which in C++/CLI terminology is called a 'handle' to a 'reference type' (since you can still have unmanaged pointers).

(Thanks to Aardvark for pointing out the better terminology.)

Upvotes: 213

Jon Tackabury
Jon Tackabury

Reputation: 49247

From MSDN, it looks like the caret means you are getting a handle to the type being created.

https://web.archive.org/web/20150117095313/http://msdn.microsoft.com/en-us/library/te3ecsc8%28VS.80%29.aspx

Upvotes: 5

salomon
salomon

Reputation: 1269

// 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

In general, the punctuator % is to ^ as the punctuator & is to *. In C++ the unary & operator is in C++/CLI the unary % operator.

While &ptr yields a P*, %mngd yields at MO^.

Upvotes: 111

Mark Ingram
Mark Ingram

Reputation: 73625

In C++/CLI it means a managed pointer. You can read more about it (and other C++/CLI features) here:

http://en.wikipedia.org/wiki/C%2B%2B/CLI

Upvotes: 5

Franci Penov
Franci Penov

Reputation: 76001

It means that this is a reference to a managed object vs. a regular C++ pointer. Objects behind such references are managed by the runtime and can be relocated in the memory. They are also garbage-collected automatically.

Upvotes: 28

1800 INFORMATION
1800 INFORMATION

Reputation: 135295

It means that it is a reference to a managed object.

Upvotes: 2

Related Questions