-2

假设我有一个返回 char* 的函数

char* GetName(int index);

还有另一个以 char* 作为输入参数的函数

void PrintName(const char* name);

所以如果我这样做

PrintName( GetName(10) );

有内存泄漏吗?如果是,为什么?这是在不使用 std::string的情况下处理此问题的唯一方法:

char* name = GetName(10);
PrintName(name);
free(name);
4

6 回答 6

1

取决于GetName返回的内容。

但是正如您所使用的free( name ),我假设它返回动态分配的内存。

那么是的,存在内存泄漏。

C++ 没有垃圾收集器。如果分配内存,则需要释放它。

或者使用智能指针。或者一个包装。

于 2012-11-07T08:41:34.597 回答
1

只要你释放()GetName()返回的内存区域,它就不是内存泄漏。但这一切都取决于 GetName(); 内部发生了什么。

于 2012-11-07T08:42:17.560 回答
1

从您共享的内容来看,没有什么叫做内存泄漏,因为您还没有分配任何内存,这可能会泄漏。您刚刚指定您可以分配一些内存并传递它。

所以,简而言之,这完全取决于你在函数中写的内容GetName&PrintName

于 2012-11-07T08:42:20.730 回答
1

很简单,everymalloc必须与 a 匹配free,everynew与 a delete,everynew[]与 a匹配delete[]。你没有说什么GetName,但我假设它使用了malloc. 在这种情况下,由于您不调用free.

第二段代码是避免内存泄漏的一种方法,另一种是调用free(可能不是一个好主意,因为如果没有动态分配的内存PrintName就无法调用)。PrintName

当然也正是因为这个难,才推荐大家使用std::string

于 2012-11-07T08:42:51.260 回答
1

如果您不小心,手动执行此 alloc/dealloc 会带来麻烦……所以最好使用 std:string 之类的东西。

话虽如此,如果char *是在GetName内部分配的,那么它需要在外部删除。您可以将其视为所有权:GetName 通过返回 char* 来放弃所有权,因此由接收 char* 的人继续处理它。您可以决定 PrintName 取得所有权,然后它必须删除它,或者按照您在上一个示例中显示的方式进行操作。

一种更简单的方法是预分配(最好在堆栈上):

char name[TheSizeYouNeed];
PrintName (GetName(10, name));

GetName 会这样做的地方:

char *GetName (int len, char *buf) {
  strcpy (buf, "xxx");
  return buf;
}
于 2012-11-07T08:48:43.333 回答
0

从你写的内容很难判断。基本上,如果您不使用malloc关键字,那么您不必调用free. 在堆栈上分配的内存(即不使用malloc)将在其范围结束时释放。

但是如果你在GetNameusing内部分配malloc,NOT 调用free会导致内存泄漏。

所以归结为:

  • 如果你不使用malloc,它不会泄漏。
  • 如果您使用malloc并且没有免费调用,它会泄漏。
于 2012-11-07T08:44:47.197 回答