こんにちわ,
現在プログラムを作成しているのですが,Segmentation Faultが出て困っています。
そのセグメント違反が出ているのがmallocの中(PCインナーの関数)で普通ならmallocの返り値がNULLかそれ以外かということになりますが,それ自体も中でセグメント違反が起こるので帰ってきません。
MALLOC_CHECK_=1によってその触っているポインターを見ると,
free(): invalid pointer 0x93c5380!
free(): invalid pointer 0x93c5c18!
とでるので,おそらくmallocのなかで必要なくなったポインターをフリーをしていると考えられるのですが,
gdbのwatchpointでそのアドレスを指定してみてみると,メインに入る前にそのポインタ自体をいじっている関数も内部的な関数みたいでどこをなおすとセグメント違反が直るのかわかりません。
このようなメモリ問題がおきたときどのようなツールや解決法があるのでしょうか。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
> このようなメモリ問題がおきたときどのようなツールや解決法があるのでしょうか。
このようなメモリ問題は起こしてはいけません。いや、冗談ではなく、本当に。
プログラムの、全然関係の無い場所で破壊が起きていたら、突き止めるのは非常に
困難です。追跡するとしたら、malloc()とfree()の呼び出しの都度、その情報を
吐き出して、後で対照させてみるといったところでしょうか。
重要なのは予防です。とりあえず、心がけることとしては、
・グローバル変数を多用しない。特に、ポインタはグローバル変数にしない。
・自動変数(内部変数)のアドレスを外部に持ち出さない。
・free()したポインタ変数は、すぐにNULLで初期化しておく。
あたりでしょうか。
すみません。ツールはあるかもしれませんが、知りません。
No.4
- 回答日時:
ParaSoft社からInsure++がでています。
以下は、Insure++の概要です。
------------------------------------
Insure++は、C/C++アプリケーションのランタイムエラーを自動的に検出する開発支援ツールです。メモリ破壊、メモリリーク、ポインターエラー、I/Oエラーといっ たC/C++特有の検出困難なエラーをプログラムコンパイル時と実行時に自動的に検出し、ファイル名、行番号、ソースコードなど、プログラムの修正に役立つ情報を的確にレポートします。また、そのレポートからソースコードにジャンプし、その場でエラーを修正することも可能です。さらに、TCAやInuseを使用することにより、カバレッジ分析、メモリ使用分析も可能です。Insure++を使用することにより、高品質なソフトウェアを迅速かつ容易に開発できます。
-------------------------------------------
私は、これを使用した経験はありませんので、今回の問題の解決に有効であるとは、言い切れませんが、試してみる価値はあると思います。
現在 LINUX用の体験版(20日間有効)が無償で提供されていますので、それを利用されてはいかがでしょうか。
参考URL:https://www.techmatrix.co.jp/asq/insure/index.html
No.3
- 回答日時:
#1さんや#2さんが仰るように、メモリ周りを壊すとタチが悪い
挙動になってしまいます。
一撃でトドメを刺してくれるようなメモリ破壊なら一目瞭然ですが、
ボディーブローのように内面を静かに壊して行くパターンも多々有り
厄介です。
後者の場合、全然関係無いタイミングで落ちます。多いのは関数から
リーターンする等スタックが動くタイミングですが、正しいポインタ
の free や realloc 等の「それらしい」場所で反応する場合も有る
から始末に悪いです。
先に答えた方の復唱になってしまいますが、取り敢えず free して
いる箇所を全て
free(ptr);
↓
if (ptr != NULL) {
free(ptr);
ptr = NULL;
}
に置き換えてみて下さい。
変数 ptr 定義部での初期化もお忘れ無く。
例えば
char *ptr = NULL;
これで2重 free の罠からは脱出できます。
No.1
- 回答日時:
そういう場合は、大抵他のところに問題があります。
一番考えられるのはメモリの二重 free です。
次に考えられるのはメモリ破壊です。
確保した領域を前か後ろにはみ出して使用していることが考えられます。
その観点でプログラムをチェックしてみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 malloc 関数を使って教えてください。 入出力例1 3 2022/07/21 09:36
- FTTH・光回線 HGW経由でルーター接続(IPv4 over IPv6)時のセグメントについて 2 2022/07/26 14:14
- 固定IP MACアドレスはLAN内で相手を特定するアドレスですか? PCから監視カメラを閲覧するときに、セグメ 3 2022/07/23 09:04
- 高校 数学の成績の波が激しい&思い込みが強すぎるのを治したいです 6 2022/12/21 21:44
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
C 開放してるのにエラー(double free or corruption (!prev))がでる
C言語・C++・C#
-
C言語 エラーの原因がわからないので,見てほしいです
C言語・C++・C#
-
Segmentation Fault (メモリ制限?)
その他(プログラミング・Web制作)
-
-
4
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
5
C言語 配列の長さの上限
C言語・C++・C#
-
6
C言語 exitの使い方
C言語・C++・C#
-
7
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
8
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
9
TOPコマンドで表示するCPU使用率で100%以上の表示について
UNIX・Linux
-
10
C言語のデバック 領域の二重解放が原因か??
C言語・C++・C#
-
11
virtual boxで、黒い画面のまま動かない
UNIX・Linux
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
【C言語】再帰が時間がかかる...
-
エクセルVBA 大容量CSVファイル...
-
VBAの配列サイズとメモリに関して
-
4GB搭載したマシンのメモリ情...
-
メモリの解放の仕方
-
ヒープ領域の「ヒープ」という...
-
大容量のメモリ確保をスワップ...
-
エクセル キャッシュメモリー...
-
動的メモリとexit(C言語)
-
sil_rew_memのメモリアクセスに...
-
メモリ不足
-
シェル(perl)が使用するメモリ...
-
C言語における再帰呼び出しの...
-
CImage::ReleaseDC()のエラーで...
-
マクロのスピードがダウンする??
-
[ちょっと息抜き]メモリを解放 ...
-
実行中にnewで領域確保した場合
-
初心者過ぎる質問ですが、VRAM...
-
プログラム領域の算出方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
【C言語】再帰が時間がかかる...
-
C言語における再帰呼び出しの...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
メモリ不足
-
エクセル キャッシュメモリー...
-
ファイルマッピング関数で失敗
-
動的メモリとexit(C言語)
-
エクセルVBA 大容量CSVファイル...
-
メモリの解放の仕方
-
「ヒープサイズの設定」て何?
-
EXCEL-VBAにてADOのレコードセ...
-
LoadLibraryしたらFreeLibrary
-
マインスイーパ、自動解析プロ...
-
バッチファイルでの実行EXEのメ...
-
エクセルのメモリ使用状況/Appl...
-
C言語:関数のメモリ上でのサイ...
-
大容量のメモリ確保をスワップ...
おすすめ情報