2016-09-22 19 views
0

私はstdinから読んでいます。私は何を読むのか分からないので、私はmallocを使う必要があります。"解放されたポインタが割り当てられていません"

は、私は時々無料(TMP)の前に、それは無料(最終)の前に起こる、ポインタが解放され時には

を割り当てられていませんでした取得しています。

ポインタを作成してから空きにする前に、両方のポインタが正しくnullでないことを確認します。誰かが私が間違っていることを指摘できますか?

total_size = 0; 
final = (char *)malloc(sizeof(char) * 1); 
if (!final) 
{ 
    printf("Error Allocating Memory for final\n"); 
    return (NULL); 
} 
while ((ret = read(0, buf, BUF_SIZE)) > 0) 
{ 
    tmp = (char *)malloc(sizeof(char) * ft_strlen(final)); 
    if (!tmp) 
    { 
     printf("Error Allocating Memory for tmp\n"); 
     return (NULL); 
    } 
    strcpy(tmp, final); 
    if (final) 
     free(final); 
    buf[ret] = '\0'; 
    total_size = total_size + ret; 
    final = (char *)malloc(sizeof(char) * total_size); 
    if (!final) 
    { 
     printf("Error Allocating Memory for final\n"); 
     return (NULL); 
    } 
    final = strcat(tmp, buf); 
    if (tmp) 
     free(tmp); 
} 
return (final); 
+0

「ft_strlen」とは何ですか?その動作が 'strlen'に似ていれば、ここでUBを得るでしょう:' tmp =(char *)malloc(sizeof(char)* ft_strlen(final)); ' –

+0

最初に、 'malloc'。なぜ 'free'の前に' final'か 'tmp'をテストするのですか?彼らは価値がある必要があります。最後に、[mcve]を見ることができますか? – KevinDTimm

+0

もう1つは、これを小さな部分に分解してデバッグを迅速化します。 – KevinDTimm

答えて

0

をホープこれはあなたのための問題です。その後、の1つをから解放できますが、有効に動的に割り当てられたブロックを指すように最初に再割り当てする必要はありません。

全体的には、tmpで多くの不必要な問題が発生しているようです。私の知る限り、あなただけのfinalポイントにブロックのサイズを大きくしようとしている、そしてそれがためrealloc()があるものです:再割り当てブロックがたりないかもしれない同じ場所で開始することができ

size_t desired_size = total_size + ret + 1; // need space for a terminator 
char *tmp = realloc(final, desired_size); 
if (!tmp) { 
    perror("Error Allocating More Memory for final"); 
    // realloc() does not free the pointer on failure; at least GLIBC's doesn't 
    free(final); 
    return (NULL); 
} 
final = tmp; 

buf[ret] = '\0'; 

// strcat is wasteful if you already know the destination string's length 
strcpy(final + total_size, buf); 
total_size += ret; 

必要に応じてrealloc()がデータをコピーします。

0

私はあなたがポインタになると少し混乱していると思います。あなたは

final = (char *)malloc(sizeof(char) * total_size); 

を書くとき あなたは​​にメモリと同等を割り当て、malloc関数は、そのメモリへのポインタを返します。 次に書き込みを続ける

final = strcat(tmp, buf); 

ポインタも返されます。 malloc(...)で割り当てたメモリは決して使用されません。だからその後if (final) free(final);にしようとすると、割り当てられたメモリを解放していません。ただ、

if (final) 
    free(final); 

final = (char *)malloc(sizeof(char) * total_size); 
     if (!final){ 
      printf("Error Allocating Memory for final\n"); 
      return (NULL); 
     } 

をコメントアウト

は、二重解放エラーを取り除きます。あなたが割り当てられたメモリをリークし、*final*tmpエイリアシングされ

final = (char *)malloc(sizeof(char) * total_size); 

[...]

final = strcat(tmp, buf); 

:これは

関連する問題