In C++, we can manage resources by objects, i.e. acquiring resource in Ctor, and releasing it in Dtor (RAII). This relies on C++'s automatic destructor invocation. But how is this done under the hood? For example, how C++ know to call Dtor for c1
but not c2
. (I know this must have been answered before, but all of my searches ended in topics explaining how to use RAII). Thanks!
class Cat;
Cat c1;
Cat* c2 = new Cat();
Edit:
I know I need to call delete for c2
. I just don't understand how Dtor is called when c1
goes out of scope.
Take a look at compiler explorer. I've linked a buildable version of your example. Just in case the link is not permanent, I've copied the code at the end if this answer.
For the
Cat c1;
line (in light red) you will see that there are three corresponding blocks in the asm, same colour.This matches the construction of the object on the stack.
Next there is
This is the normal return path, calling the destructor automatically.
Finally there is
This is the path taken if an exception is thrown (e.g., by
new
). It automatically calls the destructor and then continues the exception.For the sake of completeness, here is the C++ source code: