2011-09-09 11 views
1

次のコードを考えてみましょう。この上** glibcの検出***無料():無効なポインタ:0x0000000000400b2c

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

私の研究:このプログラムを実行すると

int main() 
{ 
    char* s = (char*) malloc(sizeof(char)*10); 
    s="hello"; 
    free(s); 
} 

を私はエラーを取得しますエラーは、malloc()で十分なメモリスペースを割り当てないことが原因である可能性があることを示します。しかし、プログラムはすでにmalloc()を呼び出しており、1charのための十分なスペースを生成しています。

+0

これは最新のC++のようなものではありませんが、有効なC++であってもそうです。 C++の優れた入門書(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を手に入れ、適切なC++を学んでください。たとえば、 'malloc()'を使う代わりに、C++で 'std :: string'クラスを使うことができます。 –

+0

ちょうど指摘すると、質問はC関連ではなく、C++ではない – EddieBytes

+0

@EddieBytes:質問はもともとはC++のみタグ付けされていました。私は 'malloc'の結果をキャストする際に別の問題を引き起こす、それをCでタグ付けした編集を承認するのかどうかはわかりません。 – Mat

答えて

10
s="hello"; 

他のアドレスを静的に割り当てられたメモリに割り当てます。それを解放するのは間違いです。また、あなたはこれをやっているので、あなたは基本的にあなたがここに割り当てたメモリをリークしている:

char* s = (char*) malloc(sizeof(char)*10); 

試してください:あなたはリテラル文字列定数にmalloc D」ポインタからsを再割り当てしている

int main() 
{ 
    static const size_t kBufferSize = 10; 
    char* s = (char*) malloc(sizeof(char) * kBufferSize); 
    strncpy(s,"hello", kBufferSize); // better than strcpy, you are protecting 
          // yourself from a buffer overflow 
    free(s); 
} 
+1

'malloc'resultの型キャストは悪いです。' sizeof(char) 'は定義ごとに1です。'strncpy'はバッファを0で埋めます(問題のないバッファであれば大きなバッファではprobleになります)。' NUL'終了を保証しません。あなたの 'main'は' return'がありません。あなたが例を挙げたら、正しいCを書くようにしてください。 –

+0

この例は、OPが与えたものの編集です。彼が彼の主人から帰ってほしい価値を引き受けることはできません。あなたの議論の残りの部分については、あなたの声明を詳述し、より良いコードを投稿してください。ありがとう。また、strncpyはもちろんNULLに終止符を打たず、名前にもかかわらず文字列型認識関数ではないメモリ関数です。 – EddieBytes

+3

バイトはcharですので、sizeof(char)は常に1になります。より良い実装はsizeof(* s)になります。 Cでは、mallocの結果をキャストすることは不必要で、他のエラー(mallocを定義するのを忘れてintを返すmallocの暗黙の定義になるなど)を隠す可能性があります。それが事を明確にするのに役立ちます。 –

1

free()にはmalloc()から届かないものを渡すのは間違いです。

"hello"~を割り当てて解放しようとすると、このルールに違反します。

0

エラーはあなたが所有していないメモリを解放していることです。あなたが動的に割り当てられたメモリに

s="hello"; 

sもはやポイント:あなたは

9

後..明示的に作成されたメモリをmalloc関数/新しい&共同介して要求するのではなく、文字列リテラルを解放しています。その文字列リテラル"hello"を指しています。最初はmallocではなかったので、それを解放することはできません。そして、あなたはもはやそれへのポインタを持っていないので、その割り当てを漏らしました。

strncpyファンクションを参照して、1つのC文字列を別の文字列にコピーします。

2

あなたはfreeを試してみてください。文字列リテラルがmallocと割り当てられていないため、freeはそれが驚くほど悪いものにつながります。

ああ、私はあなたがmallocのリターンをキャストしたのを見ます。あなたがCを使っているなら、これを行うべきではありません。 C++を使用している場合は、malloc/freeではなく、new/deleteを使用する必要があります。

関連する問題