From what I understand, in standard C++ whenever you use the new operator you must also use the delete operator at some point to prevent memory leaks. This is because there is no garbage collection in C++. In .NET garbage collection is automatic so there is no need to worry about memory management. Is my understanding correct? Thanks.
The garbage collector (GC) manages the allocation and release of memory. The garbage collector serves as an automatic memory manager. You do not need to know how to allocate and release memory or manage the lifetime of the objects that use that memory.
In Java, garbage collection happens automatically during the lifetime of a program. This eliminates the need to de-allocate memory and therefore avoids memory leaks. Java Garbage Collection is the process by which Java programs perform automatic memory management.
In the common language runtime (CLR), the garbage collector (GC) serves as an automatic memory manager. The garbage collector manages the allocation and release of memory for an application. Therefore, developers working with managed code don't have to write code to perform memory management tasks.
C++ was built with competitors in mind that did not have garbage collection. Efficiency was the main concern that C++ had to fend off criticism from in comparison to C and others. If you want it you can use it, if you don't want it you aren't forced into using it.
The long answer to it is that for every time new
is called, somewhere, somehow, delete
must be called, or some other deallocation function (depends on the memory allocator etc.)
But you don't need to be the one supplying the delete
call:
delete
to be called on an object, and all its children will automatically be delete
d as well.If you don't want to use any of these techniques, to safeguard against memory leaks, you can try using a memory checking tool. Valgrind is particularly good, although it only works on Linux
As for .NET, yes, allocating using gcnew
means that the memory is tracked by .NET, so no leaks. Other resources however, like file handles etc. are not managed by the GC.
In idiomatic high-level C++, you never call delete.
C++ does not have a standard garbage collector that works the same as in C#, and therefore it is true that fundamentally, new
and delete
need to be paired. However, there are mechanisms in C++ that completely eliminate the explicit use of delete
for code written in the modern style.
The first thing to note is that in C++ you use new
much less frequently than you use new
in C#. This is because in C# you use new
whenever you create an instance of a structure, class, or array, but in C++, you use new
only when you want to manage a data element dynamically. Most data in C++ does not require dynamic management and can therefore be created without the use of new
. [Put another way, new
has a different meaning in C# than in C++. In C++ it specifically indicates dynamic allocation, while in C# it is used for any construction.]
Secondly, any time you do call new
in C++, the return value should be handed directly to a smart pointer. The smart pointer will ensure that delete
is automatically called for you at the appropriate time.
By the way, unless you are a guru writing a low-level library (or a student learning how to do this), you should never call new
to allocate an array in C++. The standard library (and also Boost/TR1) provide template classes that allocate and manage arrays for you.
In summary, C++ does not use a garbage collector but it does have its own form of automatic memory management. There are subtle differences between the two approaches, but both approaches automate the release of memory, thereby eliminating most types of memory leaks.
The authoritative demonstration of these concepts is given by C++ creator Bjarne Stroustrup in answer to the question: How do I deal with memory leaks?
See also:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With