zmallocとafreeとSDL@シューティング
引き続きメモリと格闘中です。
先日のアドバイスを取り違えていて、malloc→ポインタをprintf→ポインタをprintf→free という風にコードしていました。すみません。
zmallocとafreeという関数を作ってmalloc後とfree直前のポインタをLogに書き出すようにしました。
このようになっています。
void * zmalloc(size_t size){ void *memory = malloc(size); Log("Malloc : = %d\n",memory); return memory; } void afree(void *ptr){ Log("Free : = %d\n",ptr); free(ptr); }
あと、これからもLog関数はお世話になるかもしれないので、整備しました。
Log関数を可変引数に。
void Log(const char *format, ...){ if(logging == TRUE){ va_list arg; va_start(arg,format); vfprintf(outputfile,format,arg); va_end(arg); } return; }
可変引数を使って関数を書いたのは今回が初めてです。
va_listはchar型のポインタをdefineしたものでした。
va_start関数がマクロで定義されていて、formatのアドレス+Intのサイズ?(sizeof(int))的な計算をしているのですが、何のためにそのように計算しているのかわかりませんでした。
va_end(arg)はargに0を代入しています。
・・・なんとなく、概要はわかった気がします。内部処理的なことは追えませんでした。
zmallocとafreeのペアをチェックしましたが、zmallocで確保された領域はすべてafreeを通っていました。
7Mもリークするので、SDL_Surfaceを疑っていたのですが、同じようにメモリ開放関数を通っているみたいです。
その後、ハマッたところが。ヘッダファイルの読み込みループ?です。
例で言うとa.hがb.hをincludeしてその逆も行っているような感じです。
応急処置的に読み込みループの一端だったヘッダファイルを#ifndef XX で再度読み込みしないようにしていますが、元からヘッダファイルの分割指針?が無かったのと、ヘッダファイルが多いので全体的にどう直してよいのか・・・という感じです。(下手に触ると同じようなエラーが起きそうで怖い)