2011-12-27 13 views
-3

私は実際にこのラッパーを使用したいと思いますが、問題はまだ安全かどうかわかりません。メモリで安全な方法は?

malloc()calloc()、およびrealloc()の使用に関するいくつかの簡単な質問があります。

string.hの

typedef struct str str; // pointer for encapsulation 

string.c

struct str 
{ 
    char *buf; 
    size_t len; 
} 

は、私は単にこれを行うヘルパー関数を持っていると言う:

str *NEW_STRING() 
    { 
     str *temp = calloc(1, sizeof (struct str)); 
     temp->len = 0; 
     temp->buf = (char *) malloc(1); 
     return temp; 
    } 

ですここで私はこれまでにしたものですこの金庫?もしそうなら、私は次のようなことをすればどうなるでしょう:

str *A_STRING = NEW_STRING(); 
A_STRING = NEW_STRING(); 

これはmallocとcallocを2回呼び出します。イニシャライザは良いでしょうか?

void str_init(str *A_STRING) 
{ 
    if (A_STRING) 
    { 
     free(A_STRING); 
    } 

    if (A_STRING->buf) 
    { 
     free(A_STRING->buf); 
    } 

    A_STRING = calloc(1, sizeof (struct str)); 
    A_STRING->buf = (char *) malloc(1); 
    A_STRING->len = 0; 
} 

最後に、これはメモリを解放する良い方法ですか?

void free_string(str *A_STRING) 
    { 
     if (A_STRING->buf) 
     { 
      free(A_STRING->buf); 
     } 
     else 
     { 
      A_STRING->buf = NULL; 
     } 

     if (A_STRING) 
     { 
      free(A_STRING); 
     } 
     else 
     { 
      A_STRING = NULL; 
     } 

     A_STRING->len = 0; 
    } 

追加情報はすべて含まれていれば素晴らしいでしょう。私は、それが良い学習図書館であるかのように、何も公開したくないのです。なぜなら、私は主に学習目的でこれをやっているからです。エラーの

+1

あなたは本当にC++なしではあまりできません。 – SLaks

+0

私はC++を好きではありません – joob

+0

2番目のコードスニペットでは、 'temp'は割り当て失敗のためにチェックされていません – fge

答えて

5

ロット:

この安全ですか?それがあれば、私はこのような何かなかった場合何が起こるでしょう:

str *NEW_STRING() 
{ 
    str *temp = calloc(1, sizeof (struct str)); 

    // If calloc fails and returns NULL all the code below is invalid and blows the code up. 

次へ:

を、それが二回mallocとのcallocを呼び出すと、悪いことでしょうか?イニシャライザは良いでしょうか?

メモリがリークします。
2番目の呼び出しは、基本的に古いオブジェクトが失われてリークする新しいオブジェクトを生成します。 str_init

void str_init(str *A_STRING) 
{ 

の問題、これは彼のメソッドが呼び出されるのは初めてのことですか?
もしそうなら、A_STRINGにはランダムな値が含まれています。
これはコードを吹き飛ばします。

if (A_STRING) 
    { 
     free(A_STRING); 
    } 

A_STRINGは解放されました(これ以上アクセスできなくなりました)。
これを行うコードはすべて無効です。

if (A_STRING->buf) // Bang blow up code. 
    { 
     free(A_STRING->buf); 
    } 

    A_STRING = calloc(1, sizeof (struct str)); 

callocの結果を確認していません。

A_STRING->buf = (char *) malloc(1); 
    A_STRING->len = 0; 
} 

これは、空きメモリには良い方法ですか?

void free_string(str *A_STRING) 
{ 
    if (A_STRING->buf) 
    { 
     free(A_STRING->buf); 
    } 
    else 
    { 
     A_STRING->buf = NULL; // Its already NULL pointless work 
    } 

    if (A_STRING) 
    { 
     free(A_STRING); 
    } 
    else 
    { 
     A_STRING = NULL; // ITs already NULL pointless work 
    } 

    // BANG you just blew up the space shuttle. 
    A_STRING->len = 0; 
} 
+0

ああ、男。このすべての情報をありがとう。 – joob

+0

'free_string()'関数では、他に何もする前に 'if(A_STRING)'をチェックする必要があります。あなた(OP)がチェックするまでに、それがヌルだった場合、プログラムは 'if(A_STRING-> buf)'で爆発しました。 –

関連する問題