Reputation: 7784
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
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
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
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
Reputation: 49247
From MSDN, it looks like the caret means you are getting a handle to the type being created.
Upvotes: 5
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
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
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