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

时间:2016-12-14 05:14:42

标签: c++ c memory memory-leaks

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

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

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

3 个答案:

答案 0 :(得分:3)

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

  

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

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

另一方面,如果您将返回值分配给变量,使用它,您稍后将释放内存。

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

与您看到的样本相同:

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

你应该像这样设计你的函数来分配内存,你可以在任何地方使用它而不用担心内存泄漏。

这里有样品。例如你的代码:

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

错误的代码,因为当你使用malloc时,你必须使用自由函数:free(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