2009-04-15 6 views
1

問題:*** glibcの検出***無料():無効なポインタ:0x41e0ce94 ***私はメッセージでいくつかの時間後にクラッシュするLinux上でC++プログラム持って

*** glibc detected *** free(): invalid pointer: 0x41e0ce94 *** 

内部を私はコンテナを大量に使っています。彼らは単純なクラスのオブジェクトを格納する必要があります。

EDIT 2009年4月17日:

一方で、エラーが単純なクラスとは何の関係もないことは明らかと思われます。他のデータ型を保持するようにコンテナを変更すると、エラーが発生します。問題は私のコードのどこかにあるはずです。私は現時点でそれを理解しようとしています...

これまでのところ私の質問に貢献してくれた皆様のおかげで、とにかく参考になりました。

+0

このクラスを使用してコードを確認するとよいでしょう。 –

答えて

4

生のcharポインタの代わりに文字列値を保持するためにstd :: stringを使用することを検討してください。次に、割り当て、コピー、および破棄メソッドで文字列データを管理することについて心配する必要はありません。おそらくあなたの問題はそこにあります。

編集:投稿した新しいクラスに問題はありません。文字列定数を指すためにchar *だけを使用している場合は、最初のバージョンで問題はありません。問題は、プログラムのどこかにあるか、クラスを使用しているところにあります。問題を追跡するために、デバッガやvalgrindを掘り下げる時間を増やす必要があります。私は指定されたアドレスで何が指し示されているのかを理解し、それがなぜ2度解放されたのかを判断しようとします。

+0

ありがとう。私はそれを試してみる。しかし、文字列のほとんどはプリプロセッサによって挿入された__FILE__文字列リテラルであり、高速でなければなりません。私はこれが最も速い実装であると思った... – Chris

+0

あなたのコードが正しいことをあなたはstd :: stringとまったく同じ作業を行うでしょう。文字列の長さを追跡するので、std :: stringがもっと速くなればもっと速くなります。 Cの文字列が文字列リテラルを指しているだけであれば問題ではないと思います。 – karunski

+0

また、投稿したクラスにfree()の呼び出しが含まれていないため、問題の原因ではありません。 – karunski

3

あなたのコピーctor、割り当てopまたはデストラクタには何か問題があります。それらのコードを表示する必要があります。

編集:はちょうどあなたが代入演算子を持っていない気づいた - あなたのコピーコンストラクタ&デストラクタを想定したあなたは、STDとして、あまりにも代入演算子を必要とし、OKです:;コンテナはそれを使用します。

+0

あなたの答えをありがとう。今私は代入演算子でそれを試しましたが、私は助けません。デフォルトの代入演算子では不十分なのはなぜですか?私は基本的には、目的のためだけにデストラクタとコピーコンストラクタを使用していました... – Chris

+0

実際の完全なコードを投稿してください - 理想的にはクラッシュする簡単な例です。 –

+0

デフォルトのコピーコンストラクタはビット単位のコピーを行います。したがって、同じ文字列を指す2つのオブジェクトがあります。それはそれが問題であるかどうかに関して文字列の管理に依存します。 –

0

デストラクタの中には何がありますか?おそらく、それはcstringから解放されます。そして、そうであればインスタンスの上であなたのcstringポインタを共有し、各インスタンスは同じポインタを解放します。

+0

現在のところ、デストラクタの中には何もありません。私は追跡目的のためにそれをipmlemented ... – Chris

1

私たちが開発しているC/C++アプリケーションで戦ってきた、と私の心に来て最初のアイデアは

    ポインタが変更されている
  • と無効possitionへのポインティングされている(PTR ++を;)またはそのようなものです。
  • オブジェクトを解放しましたが、ポインタがまだ方向を保持しています。

    Valgrindのようなツールを使用すると、コードのエラーを検出するのに役立ちます。インストールするには:

    valgrindの--tool = memcheck --leakチェック=フル...

    それはエラーを報告します:apt-getはvalgrindの

    をインストールし、それを使用する

    sudoをプログラムが実行されている間は、プログラムが終了した後もレポートが表示されます。唯一の問題は、valgrindが可能な問題として特定するものが本当の問題ではない可能性があることです。しかしそれは出発点です。

+0

あなたの答えをありがとう。私はすでにValgrindを走らせましたが、私は問題のソースに私を導いていませんでした...私が取り組んでいるプログラムはかなり複雑で、いくつかのバグがありますので少し混乱しました。多分私はそれをもう一度試してみます... – Chris

1

これは間違いなく文字列の値です。もしそれがぶら下がっているポインタの問題であれば、std :: stringを使うとこの点で助けになるかもしれません。また、すべての文字列の初期化が期待通りに機能するようにしてください。

私はクラスを正しく理解していれば、m_cstringのどのメモリがクラスの存続期間中に割り当て解除されないと想定しています。あなたの場合は、コンテナの寿命を意味します。スコープを確認してください。あなたは静的に割り当てられたCStringを割り当て解除しようとするよう

あなたのデストラクタコンストラクタでデフォルト値を使用して、その後のCStringを削除された場合は、遭遇することができるもう一つの問題はあるが、本当に悪い考えです。

文字列を返すはずの関数を定義することはできますが、何も返さず、不正な文字列で終わることがあります(通常、コンパイラは ' '、 しかしいつもではない)。

valgrindを使用してください。

さまざまなコメントを読んだ後の補遺として、プログラム内の他のどこかのメモリエラーが文字列の1つを壊した可能性が常にあります。

EDIT 4-16

この時点で、私は、オブジェクトの値が十分に構築/破壊の上に形成されていることを確認します。 (それらを印刷してみますか?)すべてがうまくいくように見える場合は、コードのどこかでエラーを調べなければならない場合があります。

+0

TK、コメントありがとう。どのような形で成っているのですか?特にm_stringなしで作業すると、エラーが多発することはありません...突然何かが容器に混ざっているように見えます。たぶんあなたは正しいと思うし、それはプログラムの別の部分です。一口。 – Chris

+0

私の通常のglibc/segfaultは、NULLで終わらないstr、初期化されていないポインタ、またはプログラム内のどこか他の場所で私の文字列を壊すことがあります。あなたはまだ文字列のメンバーなしで問題を抱えているので、それは頭のスクラッチャーです。他の通常の場合はスマートなptrsの悪用です。 Valgrind?: - / –

関連する問題