是否可以在不使用malloc的情况下进行内存泄漏?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以在不使用malloc的情况下进行内存泄漏?相关的知识,希望对你有一定的参考价值。

这个问题如标题所示:是否有可能在不使用任何内核特定方法(如malloc,new等)的情况下产生内存泄漏?

如果我在一个包含很多元素的函数内部创建一个链表怎么办,之后我会退出这个函数而不清理列表。该列表将在不使用任何malloc调用的情况下创建,即

struct list_head {
     struct list_head *next, *prev;
}

可以保证在退出此功能后将释放所有资源吗?所以我可以自由地执行它一百万次,什么都不会被泄露?

主题:如果您不使用任何特定的malloc或新调用,则不会出现堆内存泄漏。决不。是对的吗?

答案

泄漏始终连接到资源。根据定义,资源是您手动获取的,并且您必须手动释放。内存是一个很好的例子,但也有其他资源(文件句柄,互斥锁,网络连接等)。

获取资源时会发生泄漏,但随后会丢失资源的句柄,以便没有人可以释放它。较小版本的泄漏是一种“仍然可达”的情况,在这种情况下,您不释放资源,但您仍然拥有句柄并可以释放它。这主要是懒惰,但相反的泄漏总是一个编程错误。

由于您的代码从不获取任何资源,因此它也不会有任何泄漏。

另一答案

您在没有malloc或new的情况下应用的变量位于内存中的堆栈空间。因此,当函数返回时,变量将被取回。

另一方面,使用malloc或new应用的内存位于堆空间。系统不关心您是否释放空间。在这种情况下,如果不使用free或delete,则会发生内存泄漏。

另一答案

主题:如果您不使用任何特定的malloc或新调用,则不会出现堆内存泄漏。决不。是对的吗?

这种假设并不完全正确。问题是操作系统本身(或您必须依赖的其他第三方组件)也可能存在内存泄漏。在这种情况下,您可能不会主动调用malloc,而是调用可能泄漏的其他(操作系统)函数。

所以你的假设取决于你对这种事情有多强烈的考虑。你可以说OS /第三方实现在你的域之外,那么这个假设是正确的。如果你有一个定义明确的系统,并且你的要求是你必须加快一定的正常运行时间,那么也可能需要考虑这样的事情。

所以这个问题的答案......

是否可以在不使用malloc的情况下进行内存泄漏?

......是:

对的,这是可能的。

另一答案

malloc()从堆中分配内存,而字符串和结构文字(string1string2和那些list_head)的空间将在编译时保留在堆栈中。

实际上,当进程退出时(至少在* nix系统中),内核将回收为程序(堆或堆栈)分配的任何内存。

我会将内存泄漏定义为在堆上分配内存,并在程序退出时不释放它。这个定义实际上回答了你的问题

有标准函数(如strdup)将在堆上分配内存,请注意它们。

另一答案

您可以分配并忘记释放的资源的另一个示例:

如果您正在使用OpenGL,并且在没有相应的glGenBuffers()调用的情况下调用glDeleteBuffers一百万次,那么您很可能会耗尽VRAM并且您的图形驱动程序将开始泄漏到系统内存。

我发生了这件事。幸运的是,Visual Studio的内存分析器使其很容易找到。它显示为外部进程nvoglv32.dll进行的大量分配,这是我的NVIDIA OpenGL驱动程序。

以上是关于是否可以在不使用malloc的情况下进行内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不造成内存泄漏的情况下清除自定义对象的 NSMutableArray?

是否有任何免费的猫头鹰推理器可以在不将所有数据加载到内存的情况下进行推理?

Python内存泄漏[关闭]

linux内存泄漏怎么查

"每日一道面试题".net托管堆是否会存在内存泄漏的情况

C++ RAII