2012-11-07 31 views
-2

假设我有一个返回的char *是否有内存泄漏,如果是的话,为什么?

char* GetName(int index); 

而且有有焦炭其他功能的功能*作为输入参数

void PrintName(const char* name); 

所以,如果我做

PrintName(GetName(10)); 

是有内存泄漏? 如果是,为什么? 这是处理这个不使用的std :: string的唯一途径:

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

我们不能告诉你,如果你不显示我们的代码。 – Pubby

+1

显示GetName()和PrintName()的源代码,然后我们可以提供一个答案 –

+2

不只是GetName() - PrintName()中也可能有alloc/deallocs –

回答

1

要看什么呢GetName回报。

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

然后是的,有一个内存泄漏。

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

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

1

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

1

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

等等,总之,这完全取决于你写的功能GetName & PrintName

1

很简单里面,每一个malloc必须用free匹配,每newdelete,每new[]delete[] 。你不说什么GetName,但我假设它使用malloc。在这种情况下,由于您没有拨打free,因此存在内存泄漏。

第二一段代码是为了避免内存泄漏的一种方式,另一种是打电话给在PrintNamefree(可能不是一个好主意,但因为你不能就能够调用PrintName没有动态分配的内存)。

当然,正是因为这很难建议您使用std::string

0

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

但是,如果您使用mallocGetName内部进行分配,则NOT调用free会导致内存泄漏。

所以它归结为:

  • 如果你没有使用malloc,不会发生泄漏。
  • 如果您使用malloc并没有免费通话,它会泄漏。
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; 
}