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

Is there a memory leak, if yes, why?

本文关键字:为什么 如果 是否 内存 泄漏 存在      更新时间:2023-10-16

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

char* GetName(int index);

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

void PrintName(const char* name);

所以如果我这样做

PrintName( GetName(10) );

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

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

取决于GetName返回的内容。

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

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

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

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

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

从您共享的内容来看,没有什么称为内存泄漏,因为您尚未分配任何内存,这可能会泄漏。 您刚刚指定了可以分配一些内存并将其传递。

所以,简而言之,这完全取决于你在函数中写了什么GetNamePrintName

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

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

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

手动执行此操作 alloc/dealloc 会自找麻烦,如果你不小心......所以最好使用类似 std:string 的东西。

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

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

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

GetName 会这样做的地方:

char *GetName (int len, char *buf) {
strcpy (buf, "xxx");
return buf;
}

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

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

所以它归结为:

  • 如果你没有使用malloc,它不会泄漏。
  • 如果您使用malloc并且没有免费呼叫,它会泄漏。
相关文章: