Spot a bug
9/Jan 2008
I’ve found an interesting bug in a very old code today. Consider the following code snippet:
1struct foo
2{
3 void* operator new(size_t t);
4 void operator delete(void* p);
5 int i;
6};
7[...]
8{
9 foo* f = new foo();
10 ::delete(f);
11}
Old comments
Liam 2010-11-25 16:41:31
Garett there are two sections to delete, the delete expression and the delete deallocation function which maybe overloaded. The delete expression will call the destructor if there is any present for the type and then will call the delete deallocation function.
admin 2010-11-23 02:54:23
Not in this case, you’d have to call operator delete(f) explicitly. delete(f) will still execute destructor (at least under MSVC).
Garett Bass 2010-11-22 19:05:16
It is trivial in this case, but calling global delete as a function also bypasses the destructor.
admin 2010-10-31 20:33:03
That is true, in 99% of cases it’s a mistake, however it’ll only pose a problem if there’s a per-class new operator, otherwise it doesn’t really matter.
Chris 2010-10-26 03:12:41
Even if it wasn’t overriding new and delete I still think it shouldn’t explicitly call the global version.