2016-12-14 8 views
1

私はchar*を返す関数fooを持っています。関数の本体で、char*変数を宣言し、malloc()を使用してメモリを割り当てて返します。メモリ割り当て関数を条件文として使用するとどうなりますか

ここで、fooを条件文として使用しようとすると(たとえば、if (foo()) { //code })、割り当てられたメモリはどうなりますか?)理解できないのは、foo()が呼び出されたときに、メモリがfoo()に割り当てられていますか?メモリリークですか?

foo()を呼び出したときにプログラムを実行できましたが、戻り値を変数に代入しませんでしたが、メモリが不足しているかどうかはわかりませんこの場合、実際に割り当てられます。

+5

コードを改善 。 – BLUEPIXY

+0

関数の 'code'が実行された場合、メモリ割り当ては成功します。 – BLUEPIXY

+0

ありがとうございます。それは私の質問に答えます。 – IntrepidBlue

答えて

3

コメントは簡潔にあなたの質問に答えます。

は、私が理解することはできませんよと、fooが呼び出されたときに、変数に戻り値を代入 せず、 FOO、メモリリークに割り当てられたメモリがあるということですか?

実際にはメモリリークです。あなたはいくつかのメモリを割り当てて、そのメモリへのポインタを忘れています。

一方、戻り値を変数に代入した場合は、それを使用して後でメモリを解放します。

0

重要なことは、コメントやその他の回答で指摘されていることは、メモリがリークしていることです。

char* foo() 
{ 
    // Do things 
    char* info = malloc; 
    strcpy(info, "Hello"); 
    return info; 
} 

int main() 
{ 
    if (foo()) 
    { 
     std::cout << "Success" << std::endl; 
    } 
} 

foo()への呼び出しが有効であり、それはnullptrがない返すための条件が真です。しかし、foo()が返すと、ポインタを失ったので、foo()によって割り当てられたメモリがリークしました。

あなたがしたい場合は、同じ条件でポインタを格納することができます

if (char* f = foo()) 
{ 
    std::cout << "Success" std::endl; 
    // Deallocate f 
} 

これは、foo()を呼び出すfに結果を割り当て、有効なポインタをチェックします。

そうでない場合、あなたは単にstd::stringを使用することによってこの問題を解決することができます(または、あなたがchar*ないものを使用している場合、あなただけstd::unique_ptrを使用することができます):あなたが参照サンプルと同じよう

std::string foo() 
{ 
    // Do things 
    std::string info = "Hello"; 
    return info; 
} 

int main() 
{ 
    if (foo().length()) // does foo contain a valid string? 
    { 
     std::cout << "Success" << std::endl; 
    } 
} 
0

メモリを割り当てるには、このような関数を設計する必要があります。メモリリークを気にせずにどこでも使用できます。

サンプルはこちら。あなたのコード:

悪いコードあなたがmallocの場合、フリー関数を使用する必要があります:無料(文字列)。それを使用して

char* yourfunc(char* yourdes) { 
    //do anything 
    return yourdes; 
} 

:それは単に捨てとメモリリークが発生している

char *abc; 
abc = (char*)malloc(sizeof(char)*5); //init here 
yourfunc(abc); 
free(abc); // free here 
関連する問題