BREW memory pool
BrewSmartPtr にしろ BrewArray にしろ、Deleter はメモリプールから確保しています。
当然、メモリプールで自前のアロケートをするわけですが、自前のアロケータを作るのは自分にとっては非常に難易度が高いです。
なので、自分は Doug Lea 氏の malloc.c(通称dlmalloc) を使っていたりします。
http://gee.cs.oswego.edu/dl/html/malloc.html
で、この malloc.c を BREW 用に import してやるわけですが、一つだけ問題点があります。
こいつ、グローバル変数が使われています(;´Д`)
static struct malloc_params mparams; static struct malloc_state _gm_;
この2つがグローバル変数です。
これがあるとどうしようもないので何とかするわけですが、一番素直な実装としては、アプレットクラスからこの領域を取得する方法でしょう。
#define mparams (*((struct malloc_params*)((CApplet*)GETAPPINSTANCE())->getDLMallocGlobal())) #define _gm_ (*((struct malloc_state*)((byte*)((CApplet*)GETAPPINSTANCE())->getDLMallocGlobal() + sizeof( struct malloc_params ))))
CApplet に依存する形になるのが嫌だというのであれば、グローバル関数を間に挟んでやります。
// どっかで定義してちょ #ifdef __cplusplus extern "C" void* dlmalloc_global_memory(); #else extern void* dlmalloc_global_memory(); #endif #define mparams (*((struct malloc_params*)dlmalloc_global_memory())) #define _gm_ (*((struct malloc_state*)((byte*)dlmalloc_global_memory() + sizeof( struct malloc_params ))))
で、もうメモリ保護なんて(´ー`)チラネーヨ っていうのであれば単純に、
// エミュレータは自己書き換え不可 #ifdef AEE_SIMULATOR static struct malloc_params mparams; static struct malloc_state _gm_; #else const static struct malloc_params _mparams; const static struct malloc_state __gm_; #define mparams (*(struct malloc_params*)&_mparams) #define _gm_ (*(struct malloc_state*)&__gm_) #endif
こうすれば、自己書き換えによって、擬似的にグローバル変数が使えます。