是否存在内存泄漏,如果是,为什么?

时间:2012-11-07 08:38:58

标签: c++ memory-leaks

假设我有一个返回char *

的函数
char* GetName(int index);

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

void PrintName(const char* name);

所以如果我这样做

PrintName( GetName(10) );

是否有内存泄漏? 如果是,为什么? 这是处理此而不使用std :: string 的唯一方法:

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

6 个答案:

答案 0 :(得分:1)

取决于GetName返回的内容。

但是你已经使用free( name )我假设它返回动态分配的内存。

然后是的,有内存泄漏。

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

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

答案 1 :(得分:1)

只要释放()GetName()返回的内存区域,就不会发生内存泄漏。但一切都取决于GetName();

中发生的事情

答案 2 :(得分:1)

根据你所分享的内容,没有任何内容泄漏,因为你还没有分配任何内存,这可能会泄漏。你刚刚指定你可能会分配一些内存并传递它。

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

答案 3 :(得分:1)

很简单,每个malloc必须与free匹配,每newdelete,每个new[]一个delete[] }。你没有说GetName做了什么,但我假设它使用了malloc。在这种情况下,您有内存泄漏,因为您没有调用free

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

当然,正是因为建议你使用PrintName很难。

答案 4 :(得分: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;
}

答案 5 :(得分:0)

很难说你写的是什么。 基本上,如果您不使用malloc关键字,则无需致电free。在其范围结束时,将释放在堆栈上分配的内存(即,不使用malloc)。

但如果你使用GetNamemalloc内部分配,则调用free的NOT会导致内存泄漏。

所以归结为:

  • 如果您没有使用malloc,则不会泄漏。
  • 如果您使用malloc并且没有免费通话,则会泄漏。