在功能内部分配内存时内存泄漏

时间:2017-06-01 15:23:36

标签: c memory memory-leaks

我有一个创建字符串的函数。这是一个简单的例子:

char* getString() {
    char *buffer = (char*)malloc(20 * sizeof(char));

    snprintf(buffer, 20, "Some stupid text");

    return buffer;
}

这是主要功能:

int main() {
    printf("%s\n", getString());

    return 0;
}

此代码中是否发生内存泄漏(因为Valgrind没有警告任何内存泄漏)?如果是,如何在主函数中不使用新变量的情况下避免这种情况?

由于

3 个答案:

答案 0 :(得分:3)

是,不,你有内存泄漏。是的,您没有显式删除getString函数中分配的缓冲区。不,因为这个泄漏是在main()内发生而没有循环,所以当main()退出时,你的缓冲区会被释放。

所以,虽然你所做的是糟糕的编码实践,但在这种特殊情况下它并没有造成任何伤害。

你需要在main中有一些变量来解决这个问题。

答案 1 :(得分:0)

是的,你肯定有泄密。

这是正确的:

char* getString() {
    char *buffer = malloc(20 * sizeof(char));    
    snprintf(buffer, 20, "Some stupid text");    
    return buffer;
}    

int main() {
    char *mystring = getString();
    printf("%s\n", mystring);
    free(mystring);
    return 0;
}

但是你的程序valgrind应该显示有泄漏。

答案 2 :(得分:0)

是的,你有泄漏。当你只调用getstring而不将它放在变量中时,你就丢失了指向缓冲区的指针。

当您丢失指向变量的指针时(即当您丢失变量的“路径”)时会发生泄漏