Boehm GC c++
Boehm GCをc++から使っていて気付いたことがある。globalなnewとdeleteの位置が違うのだ(gc-7.0.tar.gz)。
gc_cpp.ccでは
void* operator new( size_t size ) { return GC_MALLOC_UNCOLLECTABLE( size );} void operator delete( void* obj ) { GC_FREE( obj );}
と定義されている。ライブラリのコンパイル時にGC_DEBUGフラグが評価されるので、自由にフラグを切替えられない。
それに対してgc_cpp.hでは
inline void* operator new( size_t size, GCPlacement gcp, GCCleanUpFunc cleanup, void* clientData ) { void* obj; if (gcp == UseGC) { obj = GC_MALLOC( size ); if (cleanup != 0) GC_REGISTER_FINALIZER_IGNORE_SELF( obj, cleanup, clientData, 0, 0 );} else if (gcp == PointerFreeGC) { obj = GC_MALLOC_ATOMIC( size );} else { obj = GC_MALLOC_UNCOLLECTABLE( size );}; return obj;}
と定義している。ユーザープログラムのコンパイル時にGC_DEBUGフラグが評価されるので、こちらは自由にフラグを切替えられる。
そのため、
#define GC_DEBUG #include <gc/gc_cpp.h> int main() { GC_INIT(); int *pi = new(PointerFreeGC)int(1); delete pi; return 0; }
のようにすると不整合が起きてしまう。何故こうなっているのかは判らないが、gc_cpp.ccの内容をgc_cpp.hに移した方が良さそうに思う。