質問です。
newをオーバーライドして遊んでいたところ、テンプレートと重なるとおかしなことになるのに気づきました。

デストラクタが存在するクラスの配列を new[] すると、本来より4バイト多くなるのはわかります。
operator new 側でreturnしたものに+4バイト移動したポインタが実際に返るのもわかります。

この状態ならば、

CHoge* p;
p = new CHoge [5];
delete [] p;

上のp==0xXXXXXX16;とした場合、operator delete[](void *p)のpには0xXXXXXX12が代入されるのが期待できますし、普段はそうなります。
ただ、以下のようにした場合におかしくなるのです。

template <class T>
class CTest
{
public:
T* m_p;
void run()
{
m_p = new T [5];
delete [] m_p;
}
};
こうした場合にoperator delete[](void *p)のpには0xXXXXXX16が代入されてしまいます。
(TがCHogeの場合に。です)

当然new[]でmalloc. delete[]でfreeしている場合、freeでエラーが出てしまいます。
VC6.0のデバッグモードで見ても、きちんとTはCHogeになっています。
これの解決方法はありますでしょうか?