1. ホーム
  2. c

[解決済み] glibc が free() の無効なポインタを検出しました。

2022-02-07 17:20:16

質問

動的なメモリ割り当てでちょっと困っているんだ。

以下は、この問題を解決するために試行錯誤したテストコードです(私の現在のプロジェクトのコードでも同じ問題がありますが、これは単にそれを示すより簡単な方法です)。

#include<stdlib.h>
#include<stdio.h>
#include<assert.h>

int main(){

    int x = 5;
    int *ptr = (int*) malloc(sizeof(int));
    assert(ptr != NULL);
    ptr = &x;

    printf("x = %d\n",x);

    *ptr = 3;
    printf("x = %d\n",x);

    free(ptr);

    return 0;
}

プログラムは正常にコンパイルされ、実行すると正しい出力が印刷されます "x = 5 x = 3"。 しかし、その後、エラーが発生しました。

glibc detected  ./dnam: free(): invalid pointer: 0xbfccf698

dnamはテストプログラムの名前です。 このエラーについて読んだ限りでは、malloc/calloc/reallocしていないメモリを解放することが原因だと思われます。

このエラーメッセージの後に、バックトレースとメモリーマップが表示されます。メモリーマップの最後には、プログラムが中断した(コアダンプした)と言われました。

解決方法は?

   int *ptr = (int*) malloc(sizeof(int));

   ptr = &x;

を変更しています。 ptr の値です。それをフリーにしようとすると、コンパイラは無制限の復讐をすることになります。

これを

free(ptr);

あなたは free -を通じて割り当てられていないオブジェクトを malloc .