问题
I stumbled across this code and am too proud to go and ask the author what it means.
Hashtable^ tempHash = gcnew Hashtable(iterators_);
IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();
What is gcnew
and how important is it to use that instead of simply new
? (I'm also stumped by the caret; I asked about that over here.)
回答1:
gcnew is for .NET reference objects; objects created with gcnew are automatically garbage-collected; it is important to use gcnew with CLR types
回答2:
gcnew
is an operator, just like the new
operator, except you don't need to delete
anything created with it. It's garbage collected. You use gcnew
for creating .Net managed types, and new
for creating unmanaged types.
回答3:
The caret '^' acts simarly to the '*' in C/C++ when declaring a type;
// pointer to new std::string object -> memory is not garbage-collected
std::string* strPtr = new std::string;
// pointer to System::String object -> memory is garbage-collected
System::String^ manStr = gcnew System::String;
I use the term 'pointer' when describing the managed object as a managed object can be compared to 'nullptr' just like a pointer in C/C++. A reference in C/C++ can not be compared to 'nullptr' as it is the address of an existing object.
Managed objects use automatic-reference-counting meaning that they are destroyed automatically when they have a reference count of zero although if two or more unreachable objects refer to eachother, you will still have a memory leak. Be warned that automatic reference counting is not free performance wise so use it wisely.
来源:https://stackoverflow.com/questions/202459/what-is-gcnew