5

老问题,但我仍然有一些想法。

char * getarrmal(void)
{
    char *str;
    str = (char *)malloc(10);
    str[0] = 'a';
    str[1] = 'b';
    str[2] = 'c';
    str[3] = '\0';
    return str;
}

char * getarrdef(void)
{
    char *str = "hello";
    return str;
}

char * getarrfix(void)
{
    char str[10] = "world";
    return str;
}

三个功能。前两个将返回字符串地址并将字符串存储在堆中,以便您可以继续使用它,例如 main() 函数。

在最后一个函数中,str 是一个局部变量,不能使用返回的 str。

我的问题是,当我返回调用前两个的函数时,我应该手动释放它们吗?很容易相信 malloc 的情况是正确的,但我不确定 char *str = "hello" 是否也是如此。

如果我使用 getarrdef() 而没有释放它的返回值,那么我会以某种方式发生内存泄漏吗?

4

1 回答 1

4

不,您绝对应该尝试释放第二个。它没有存储在堆中,而是一个字符串文字,试图释放它是未定义的行为。来自C++11 7.21.3.3 The free function

...如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 被释放,则行为未定义。

对于第一个,是的,分配内存的责任与内存本身一起传递是一种很好的做法。这意味着如果有东西分配它并把它交给你,那么你就有责任释放它。

即使你通过将它传递回一个函数来释放它也是如此:delarrmal()- 通过这样做,你已经赋予该函数释放它的责任。

于 2013-04-24T03:42:02.067 回答