假设我有一个返回char *
的函数char* GetName(int index);
还有另一个函数将char *作为输入参数
void PrintName(const char* name);
所以如果我这样做
PrintName( GetName(10) );
是否有内存泄漏? 如果是,为什么? 这是处理此而不使用std :: string 的唯一方法:
char* name = GetName(10);
PrintName(name);
free(name);
答案 0 :(得分:1)
取决于GetName
返回的内容。
但是你已经使用free( name )
我假设它返回动态分配的内存。
然后是的,有内存泄漏。
C ++没有垃圾收集器。如果你分配内存,你需要释放它。
或者使用智能指针。或者包装。
答案 1 :(得分:1)
只要释放()GetName()返回的内存区域,就不会发生内存泄漏。但一切都取决于GetName();
中发生的事情答案 2 :(得分:1)
根据你所分享的内容,没有任何内容泄漏,因为你还没有分配任何内存,这可能会泄漏。你刚刚指定你可能会分配一些内存并传递它。
所以,简而言之,这完全取决于你在函数GetName
& PrintName
答案 3 :(得分:1)
很简单,每个malloc
必须与free
匹配,每new
个delete
,每个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
)。
但如果你使用GetName
在malloc
内部分配,则调用free
的NOT会导致内存泄漏。
所以归结为:
malloc
,则不会泄漏。malloc
并且没有免费通话,则会泄漏。