gccでnewとdeleteをオーバーライド
困ったなぁ、Carbonのプログラムで自作メモリマネジャーがうまく動かない。Carbonフレームワークからnewとか呼び出されたが、たまにデフォルトのnewを実行されたりして、しかもdeleteの時に、デフォルトのdeleteじゃなくて、オーバーライドされたdeleteを実行されちゃった。やっぱり、gcc 4.xのせいだね、オーバーライドされたnew/deleteのシンボルがすべてパブリックになっちゃった。
XCodeで、unexported symbol fileを使って、オーバーライドされたnew/deleteを隠したが、zero linkがうまく動かなかった。いろいろ調べた結果、always_inlineと言う関数の属性で隠せるようになった。コードはこんな感じ…newとdeleteも同じ。
inline void* operator new(size_t size) __attribute__ ( (always_inline) ); inline void* operator new(size_t size) { return memAlloc(size); // 自分のメモリ確保関数。 } inline void operator delete(void* addr) __attribute__ ( (always_inline) ); inline void operator delete(void* addr) { memFree(addr); // 自分のメモリ解放関数。 }