サブクラスで演算子 new/delete をオーバーロードしていますが、かなり奇妙に思える動作に気付きました。以下のサンプルコードを見てください。
#include <stdlib.h>
#include <stdio.h>
class Base
{
public:
virtual ~Base()
{
}
};
class Derived : public Base
{
public:
void* operator new(unsigned int size, int capacity)
{
printf("> new(unsigned int, int)\n");
return malloc(sizeof(Derived));
}
void operator delete(void* ptr, int)
{
printf("> delete(void*, int)\n");
free(ptr);
}
void operator delete(void* ptr)
{
printf("> delete(void*)\n");
free(ptr);
}
};
int main(int argc, char** argv)
{
Base* base = new (0) Derived();
delete base;
return 0;
}
このコードは、Visual Studio 2010 でコンパイルすると、次の出力を生成します。
> new(unsigned int, int)
> delete(void*)
一致する削除演算子 ( Derived::operator delete(void*, int)
) がここで呼び出されないのはなぜですか? 何をしても、一致する演算子 delete を呼び出すコードを取得できません。