質問: delete演算子オーバーロードについて delete演算子オーバーロードする際、 デストラクタが呼び出される困っています。 例えば、 void* operator new(size_t size, const char* filename , int line , const char* funcname ); とnew演算子をグローバル定義します。 すると、意図通りnew演算子がcallされ、対応するコントラクタも 問題なくcallされます。 そして、上記new定義にペアとなるdelete演算子もグローバル定義します。 voidoperator delete(void* pmem, const char* filename , int line , const char* funcname ); 通常どおりdeleteで呼び出してしまうと、標準のdeleteがcallされてしまうため、 #definemyelete(s)operatordelete( (void*)(s) , __file__ , __line__ , __function__ ) 上記のようなカスタムマクロを定義してcallしています。 オーバーロード定義されたアドレスがcallされるところまで、 意図通りなのですが、肝心のデストラクタがcallされません。 型が判明している場合、 単体でデストラクタを明示的に呼び出すことはできますが、 任意のポインタのデストラクタを明示的に呼び出す方法は ありますでしょうか?
回答: この operator delete だけではできないかもしれない. とりあえず思いつくのは template void destruct_pointer(t *p) { p->t::~t(); } というテンプレート関数を定義して #define mydelete(s) (destruct_pointer(s), operator delete( (void*)(s) , __file__ , __line__ , __function__ )) とか.