释放内存的正确方法

3

我已经有一段时间没有写C代码了,必须重新理解指针。这是一个修改指针内容的函数。问题是这段代码是否正确。如果我只释放了指针,是否足够?还是我需要释放指针所指向的内容。

void foo(char **str) {
   // str has been allocated enough bytes for the following text
   *str = "allocate some text";
}

int main(int arc, char *argv[]) {
    char *someString;
    foo(&someString);
    free(someString); // is this the correct place to free
}

谢谢你。

我猜你的函数调用应该是 foo(&someString);... - Oliver Charlesworth
它将是foo(&someString)。 - Mel
5个回答

10

不,你不需要调用free(),因为你从未使用malloc()分配数据。更具体地说,对指向字符串字面值的指针调用free()将导致未定义行为


2
在这种情况下,您不应该进行释放。`free()` 应该总是对应调用 `malloc()` 函数。
在这里,您正在“释放”从未分配的常量内存。

1

这段代码中有一些让我困惑的地方。

为什么注释说“str已经分配了足够的字节来存储以下文本”?即使它已经被分配,你也是在给指针赋一个新值,所以分配那块内存并没有什么用处。

无论如何,根据这段代码,不应该调用free()


1

你的代码中没有显示,但你写道str已经分配了足够的字节。所以这很好,可以使用free释放,但是你将指针赋值给常量字符串 - *str = "allocate some text";(正如oli所说,在free时会导致未定义的行为),而应该执行strcpy()

strcpy(str, "allocate some text");

-2

首先需要调整foo方法的调用,因为参数不匹配。它应该看起来像这样

foo(&someString);

但是就个人而言,我同意你调用方法free(someString)的位置。因为应用程序即将结束,你不再需要任何指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接