0

これは私の最初の質問なので、これがばかげている場合は申し訳ありません。検索を試みましたが、コードの問題を見つけることができません。Linuxでこのエラーが発生している他の人のコードをデバッグしていますが、Solarisでは問題なく動作しました。

*** glibc detected ***  free(): invalid next size (fast): 0x096c72b0 ***
======= Backtrace: =========
/lib/libc.so.6[0xa986c5]
/lib/libc.so.6(cfree+0x59)[0xa98b09]
...

コードは巨大で、多くの内部ロジックがありますが、問題がどこにあるかのサンプルを作成しようとしました..

Typedef Struct _FIELD
{
Int  size;
Char str[25];
Void *pData;
Void *pValue;
}FIELD;

Class ABC
{
 FIELD * field1;
 FIELD* getFIeld(int);
 …}

ABC::ABC()
{
field1=NULL;
}
ABC::~ABC()
{ 
for (int I = 0; I < total_num; i++)
{
    free (field1[i].pData);
   free(field1[i],pValue);
 }
free(field1);
}

FIELD* ABC::getField(int total_num)
{
FIELD *pFields = NULL;
pFields = GetValues( total_num);//just sets up pFields

field1 = malloc ( total_num * sizeof(FIELD));
for (int i =0 ; i<total_num; i++)
 {
 // earlier this code was memcpy, memcpy(&field1, &pFields, sizeof(FIELD)) I have       changed this to explicit copy
 Strcpy(field1[i].str, pFields[i].str);
  field1[i].size = pFields[i].size;
  field1[i].pData = malloc(fields[i].size);
  field1[i].pValue = malloc(fields[i].size);
   //I am not doing strdup for pData and PValue as I checked they are null at this point.
 }
 free(pFields);
 return(field1);

}
…
//Main 
FIELD* field1 = NULL;

  ……
 field1 = getField(n);
  …….

 field1 =getField(n)
 …

繰り返しますが、これが明らかなことである場合はお詫び申し上げます..

これは、メモリが構造体に割り当てられる方法によるものだと確信しています。

ありがとう!

4

1 に答える 1

0

どこかでバッファオーバーフローが発生している可能性があります。glibc から得られるエラー メッセージは、通常、使用済みブロックと解放済みブロックを追跡する内部レコードを上書きすることにより、ヒープが破損していることを示しています。glibc は、この種のエラーを検出しようとすることに非常に積極的であり、他のプラットフォームよりも積極的です。おそらく他の場所でも同じバグがありますが、libc はそれを検出していません。

バグの正確な場所については、あなたのコードで直接確認することはできませんが、そのコードはかなりの数の仮定 (データ構造に記録されたサイズのバッファーを事前に割り当てるなど) とプログラムの残りの部分を作成しています。これらの仮定に従っていない可能性があります。

短いバージョン: valgrind をインストールし、その下でプログラムを実行します。これは、UNIX 用のランタイム メモリ デバッガであり、割り当てられたメモリの最後を超えて書き込みを行った場合と、コードのどの行に問題があるかを教えてくれます。これは、この種の問題で最初に到達することです。

于 2013-03-17T19:49:07.923 に答える