質問: メモリのセグメント違反の解決方法を教えてください。 こんにちわ, 現在プログラムを作成しているのですが,segmentation faultが出て困っています。 そのセグメント違反が出ているのがmallocの中(pcインナーの関数)で普通ならmallocの返り値がnullかそれ以外かということになりますが,それ自体も中でセグメント違反が起こるので帰ってきません。 malloc_check_=1によってその触っているポインターを見ると, free(): invalid pointer 0x93c5380! free(): invalid pointer 0x93c5c18! とでるので,おそらくmallocのなかで必要なくなったポインターをフリーをしていると考えられるのですが, gdbのwatchpointでそのアドレスを指定してみてみると,メインに入る前にそのポインタ自体をいじっている関数も内部的な関数みたいでどこをなおすとセグメント違反が直るのかわかりません。 このようなメモリ問題がおきたときどのようなツールや解決法があるのでしょうか。 よろしくお願いします。
回答: > このようなメモリ問題がおきたときどのようなツールや解決法があるのでしょうか。 このようなメモリ問題は起こしてはいけません。いや、冗談ではなく、本当に。 プログラムの、全然関係の無い場所で破壊が起きていたら、突き止めるのは非常に 困難です。追跡するとしたら、malloc()とfree()の呼び出しの都度、その情報を 吐き出して、後で対照させてみるといったところでしょうか。 重要なのは予防です。とりあえず、心がけることとしては、 ・グローバル変数を多用しない。特に、ポインタはグローバル変数にしない。 ・自動変数(内部変数)のアドレスを外部に持ち出さない。 ・free()したポインタ変数は、すぐにnullで初期化しておく。 あたりでしょうか。 すみません。ツールはあるかもしれませんが、知りません。