当使用内存分配函数用作条件语句时会发生什么

What happens when a memory allocating function is used as conditional statement

本文关键字:什么 语句 内存 分配 函数 条件      更新时间:2023-10-16

我具有返回 char*的函数 foo。在函数的主体中,我声明char*变量,使用malloc()分配内存并返回。

现在,如果我尝试将函数foo用作条件语句(例如if (foo()) { //code } ),分配的内存会发生什么?我无法理解的是,当调用foo()时,未将返回值分配给变量,内存是否分配了foo(),内存泄漏?

我打电话给foo()时能够执行程序,但没有将返回值分配给变量。但是我无法弄清楚在这种情况下是否真的分配了内存。

评论简洁地回答了您的问题。

我无法理解的是,当foo被调用时 将返回值分配给变量,是分配的内存 foo,内存泄漏?

这确实是内存泄漏。您正在分配一些内存,然后忘记指针的指针。

另一方面

重要的是要实现的重要事情,在评论和其他答案中指出的是您正在泄漏内存。

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;
    }
}

与您看到的样本相同:

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

您应该将这样的功能设计到Alloc内存中,您可以在任何地方使用它而不会关心内存泄漏。

在这里采样。例如您的代码:

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