【问题标题】:Memory leak when allocating memory inside function在函数内部分配内存时发生内存泄漏
【发布时间】:2023-03-28 04:49:01
【问题描述】:

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

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 没有警告任何内存泄漏)?如果是的话,如何在不使用主函数中的新变量的情况下避免这种情况?

谢谢

【问题讨论】:

  • 是的,您有内存泄漏。如果您不想将指针分配给传递给free 的变量,则没有办法避免它。
  • 是的,你应该把它放到printf之前的一个变量中,然后是free
  • 只要使用 valgrind 就可以了。

标签: c memory memory-leaks


【解决方案1】:

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

因此,虽然您所做的是糟糕的编码习惯,但在这种特殊情况下不会造成任何伤害。

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

【讨论】:

    【解决方案2】:

    是的,这里肯定有泄漏。

    这是正确的:

    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 应该显示有泄漏。

    【讨论】:

    • free(mystring)
    • 是的,我应该比问这个问题更清楚。我自己也喜欢这样。
    【解决方案3】:

    是的,您有泄漏。当您只调用 getstring 而不将其放入变量中时,您会丢失指向缓冲区的指针。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-03
      • 2016-09-12
      • 2021-12-25
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多