2016-12-14 55 views
1

我有一個函數foo,它返回char*。在函數體中聲明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

一樣的樣品,你看:

char * strcpy (char * destination, const char * source); 

你應該設計你的函數這樣來分配存儲器,你可以隨處使用它而無需關心內存泄漏。

樣品在這裏。例如,您的代碼:

char* yourfunc() { 
char *str; 
str = (char*)malloc(sizeof(char)*5);//only sample code 
return str; 
} 

糟糕的代碼,因爲當你的malloc,則必須使用免提功能:免費(STR)。 提高代碼:

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

使用它:

char *abc; 
abc = (char*)malloc(sizeof(char)*5); //init here 
yourfunc(abc); 
free(abc); // free here 
相關問題