【问题标题】:Array in C, and its pointerC中的数组及其指针
【发布时间】:2013-04-17 11:19:35
【问题描述】:

老问题,不过我还是有一些想法。

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() 并且不释放它的返回值,那么我会以某种方式发生内存泄漏吗?

【问题讨论】:

  • 如果您分配了它,并且您没有使用malloc(或它的表亲之一)这样做,您不会调用free。很简单。

标签: c memory heap-memory stack-memory


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的快速回复:)。那么就有点有意思了,第二个函数调用者的栈中str存储在哪里?
  • @coldguy,str(指针)在前两种情况下存储在堆栈中,str(数组)存储在第三种情况下。但是,指针 指向 的内容在前两种情况下有所不同(第三种情况无关紧要,因为 str 不是指针(在函数内))。在第一种情况下,它指向堆,在第二种情况下,它指向不在堆中的字符串文字。
  • 分配内存的函数或模块应该释放它;将东西传递给其他人释放是泄漏内存或在双重释放时崩溃的好方法。但最重要的是确定并记录所有权语义。当然,如果您放弃过时的 C 语言,可以安全地传递所有权,就像 C++11 的 unique_ptr 一样。
  • @coldguy 字符串文字既不在堆中也不在堆栈中;在大多数实现中,它们与静态变量和全局变量位于同一位置。
  • 或者,第二个函数将是最佳实践。你可以返回一个字符串,你不需要担心它的内存分配。看起来很棒……
猜你喜欢
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多