バックグラウンド処理でのメモリの二重開放への対策について


プログラムaをシェルスクリプトを用いて同時に複数回、バックグラウンドで実行している中で以下のようなエラーが出ます。

> *** Error in `a': double free or corruption (!prev): 0x00000000009120b0 ***

このエラーはメモリの二重開放が原因だと認識しています。  
ここでプログラムa はc言語で書かれており、mallocとfreeを用いてメモリの動的確保をしています。

[code]

    #define SAFE_FREE(ptr) { free(ptr); ptr = NULL; } 
    
    j=(double *)malloc( sizeof( double ) * MAX );
    pow=(double *)malloc( sizeof( double ) * MAX );
    
    SAFE_FREE(j);
    SAFE_FREE(pow);
    
    
[/code]

上記のようにメモリの二重開放には、使い終わったポインタにNULLを代入することで対策していたのですが依然として二重開放によるエラーが見られるので困っています。

上記のプログラムに問題があるでしょうか？バックグラウンドで複数回同時に実行していることが原因なのでしょうか？その場合の対策方法など、ご存じの方はご教授いただきたいです。

ありがとうございます。




提示コードは質問のためのコードだと思いますが、ここだけでは問題のあるところは無さそうに見えます。  
問題が再現するコードを提示することが出来れば、誰かが問題を見つけられるかもしれません。

malloc()でエラーチェックを指定していないことが気になりますが、(NULLが返ってきたらおそらくその先の処理は意図通りに動かせないと思います。)  
SAFE_FREEマクロ自体は問題は無いと思います。

可能性としてぱっと思いつくのは、  
・不正メモリアクセスしてポインタ変数を破壊してしまっている。  
・malloc()したポインタ変数を別のところで別のポインタ変数にコピーしていて、最終的に両方でSAFE_FREEしてしまっている。  
とかでしょうか。

あともう1点、

> バックグラウンドで複数回同時に実行していることが原因なのでしょうか？

複数実行されるプロセス同士は独立したメモリ空間で実行されるためmalloc()されたポインタが  
干渉するようなことはありません。

