Re: Interaction of delete and destructor
junw2000@gmail.com wrote:
...
struct A {
virtual ~A() { cout << "~A()" << endl; }; //LINE1
void operator delete(void* p) {
cout << "A::operator delete" << endl;
free(p);
}
};
struct B : A {
void operator delete(void* p) {
cout << "B::operator delete" << endl; //LINE2
free(p);
}
~B(){ cout << "~B()" << endl; }; //LINE3
};
int main() {
A* ap ;
B *bp = new B;
ap = bp;
delete ap; //LINE4
}
The output of the code is:
~B()
~A()
B::operator delete
I can not understand the output. When LINE4 is executed, LINE1 is
executed, right?
No. Delete-expression at LINE4 will first invoke the proper destructor
of the object. And that's 'B::~B()', i.e. LINE3.
Since ~A() is virtual, LINE3 is called.
Yes. As I said above 'B::~B()' is called. 'B::~B()' will in turn call
its parent's destructor 'A::~A()', LINE1. That's what you see in your
output.
How can LINE2 be executed?
This is a requirement of C++ language specification. 'operator delete'
is chosen as if the lookup for the operator is made from the proper
destructor of the object (by 'proper' I mean 'matching the dynamic type
of the object'). In this case the lookup for 'operator delete' is
performed from 'B::~B()'. 'operator delete' that is "seen" from
'B::~B()' is 'B::operator delete', LINE2. That's why it is called.
How all this is achieved in practice belongs to the "compiler magic"
department.
"delete ap" calls A's destructor. Then B's destructor is called.
No, it's the other way around. Take a look at the output. 'delete ap'
calls B's destructor - 'B::~B()'. Then 'A::~A()' is called by 'B::~B()'.
Can B's destructor call B's operator delete?
Well, that how it is often implemented under the hood. But that's
nothing more that an implementation detail.
In general, delete invokes destructor, right? Can destructor invoke
delete?
What exactly do you mean by 'delete' in this case? Delete-expression or
'operator delete'?
--
Best regards,
Andrey Tarasevich