Re: Why user-defined delete not called
vl106 wrote:
Although delete operator is defined in class C it is only called
for pointer types. That is "delete pC" works fine. It does not
work for aC ("delete aC"). But aC.operator delete(aC) also
works fine.
Yes I know delete is for dynamically allocated objects only. So
don't wonder about my intention.
So what is causing C++ not to call C::delete in this case?
#include <iostream>
class C {
public:
void operator delete(void*);
operator void*() { return 0; }
};
void C::operator delete(void*) {
std::cout << "C::delete" << std::endl;
}
int main() {
C aC;
delete aC; // 1) C::operator void*
// 2) calls stdlib delete - not C::delete
aC.operator delete(aC);
C* pC = &aC;
delete pC; // 1) C::operator delete
return 0;
}
The answer to your question is in 5.3.5.2.
If delete operator is called with class type as operand, operand is
converted to a pointer. Then delete operator is used with that pointer.
C class can only be converted to void*, so delete is called with pointer
to void. That's why C::operator delete is not called in that case.
You can check this either by adding conversion from C to C* or by
overloading general delete operator. If C class can be converted to both
void* and C* (or any other pointer), code won't compile, because it's
ambiguous (compiler doesn't know whether convert delete operand to C* or
to void*).
Pawel Dziepak
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]