2009-06-28 8 views
4

私は文字列を束縛し、結合された文字列を返す小さな関数を作った。しかし、関数の3番目の変数にメモリを割り当てるので、関数が終了したときにメモリが解放されるか、そこに残りますか?後で解放する必要がありますか?私はそれを解放する必要がある場合、それを行うための最もスタイリッシュなソリューションは何ですか?このリークメモリはありますか?

ここにテストコードがあります。それは動作しますが、そのメモリが私のツールで解放されているかどうかはわかりません。

#include <stdio.h> 
#include <math.h> 
#include <string.h> 

char * StrCat(const char *st1, const char *st2){ 
    char *string = calloc((strlen(st1) + strlen(st2) + 1), sizeof(char)); 
    strcat(string, st1); 
    strcat(string, st2); 
    return string; 
} 

int main(){ 
    printf("String: %s\n", StrCat("HELLO ", "WORLD")); 
    return 0; 
} 
+0

はい。私はすべてを自動化し、コードで自分の人生を楽にするこの機能を果たしました。しかし、StrCatが大文字であることに注意してください。標準のstrcat呼び出しではありません。 –

+0

ちょうど今気付いた、 'StrCat'は 'strcat'に似ています。私はそれを 'myStrCat'と呼ぶことを勧めました。 –

+0

ああ、それは意図的なもので、私はそれでうまく動作し、他の文字列関数でやった。しかし、あなたがそれを悪い習慣と考えるなら、私はそれを変えるでしょう。 –

答えて

13

はい、あなたはそれを解放する必要があります。

おそらくのようなもの:

int main(){ 
    char *s = StrCat("HELLO ", "WORLD"); 
    printf("String: %s\n", s); 
    free(s); 
    return 0; 
} 
+0

callocはメモリをゼロにするので、余分なmemsetは必要ありません(@DalGrはmallocを代わりに使用する必要がありましたが、それは彼がやったことではありません)。 –

+0

callocはメモリを0に設定します –

+0

私はcalloc()の実装について忘れていました。ありがとう。 –

3

はい、あなたはそれを解放する必要があります。漏れを検出するためにvalgrindを試してください。

3

はい。 calloc、malloc、newなどを呼び出す場合は、メモリを解放する関数への呼び出しも行う必要があります。

5

printfの直後にアプリケーションが終了するので、アプリケーションが終了するとアプリケーションがそれを実行するので、アプリケーションを解放する必要はありません。しかし、はい、それを解放するのは常に良い習慣です。

+1

私は原則としてあなたに同意しますが、人々を困らせるこのような考え方です。特に初心者。 – Steve

2

メモリリークと空きメモリこれはトリッキーな問題です。デバッガを試す価値がありますか?私はそのような問題を解決するためにデイケーカーを使います。

関連する問題