What is gcnew?
gcnew is for .NET reference objects; objects created with gcnew are automatically garbage-collected; it is important to use gcnew with CLR types
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.
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.