2016-10-05 2 views
1

さて、私は呼び出すメソッドを持っています。呼び出されたメソッドは、呼び出されたメソッドの内部に割り当てられたchar*を返します。返されたchar*を新しいchar*に割り当てた後、私はそれを使用した後で解放したい。しかしXcodeは文句を言ってエラーを投げます。それは私が自由にしようとするオブジェクトは割り振られていないと言いますが、私はそれを割り当てると確信しています。ここでc:割り当てられたオブジェクトのエラーを解放する

は私のコードです:

void print_r() 
{ 

    char *stateA = isActive(ruter_array[id]->flagg); 

    //print out the results etc 

    free(stateA);  <-----The program crashes here. 


} 

char * isActive(unsigned char a_flag) 
{ 
    char *ret = malloc(5); 

    if((a_flag & 1) == 1) 
    { 
     //is active 
     ret = "yes"; 
     return ret; 
    } 
    ret = "no"; 
    return ret; 

} 

これが何をするのか理解することは重要ではない。その、なぜこの解放がクラッシュしていますか?

+0

'isActive'は文字列定数" yes "または文字列定数" no "へのポインタを返します。これは、何か他のもの(文字列定数)であるため、割り当てられていないオブジェクトです。また、オブジェクトをmallocateし、そのオブジェクトへのポインタを返しません。 (また、 "mallocate"は一般的な用語ではありませんが、それは動作します) – immibis

答えて

3
ret = "no"; 

ポインタを上書きします。変更:

strcpy(ret, "no"); 

"yes"の場合も同様です。

@DavidSchwartzによって指摘されているように、あなたの目的のために、おそらく動的に割り当てられたメモリを使用する必要はありません。ただ、直接文字列リテラルを返すことができます:その場合の

char * isActive(unsigned char a_flag) 
{ 
    if((a_flag & 1) == 1) 
    { 
     //is active 
     return "yes"; 
    } 
    return "no"; 
} 

そしてもちろんの呼び出し元すべきではないfree返された値を。

+2

あるいは、 'malloc'や' free'を使う必要はありません。 –

+0

うわー。私は、ポインタとメモリのことについて、私が必要としていることはすべて知っていると思っていました。どうやら、そうではありません。 〜 – Koen

2

メモリを割り当て、そのメモリの最初のアドレスをポインタretに割り当てますが、"no""yes"はコンパイル時にメモリに静的に格納される文字列リテラルです。 ret = "no"を実行すると、ポインターが文字列リテラル"no"の最初の文字を指すように変更されます。これで、割り当てたメモリにアクセスできなくなり、メモリリークが発生しました。しかし、クラッシュは、malloc()またはその友人によって割り当てられていないメモリを解放しようとしているためです。

1

あなたもstrdupを使用することができます書かれhereとして

char * isActive(unsigned char a_flag) 
{ 
    return strdup((a_flag & 1) == 1 ? "yes" : "no"); 
} 

それも解放できるようにポインタがまだmalloc経由で割り当てられました。

関連する問題