C++内存泄漏

       程序在堆中申请的动态内存,在程序使用完成时没有得到及时的释放。当这些变量的生命周期已结束时,该变量在堆中所占用的内存未能得到释放,从而就导致了堆中可使用的内存越来越少,最终可能产生系统运行较慢或者系统因内存不足而崩溃的问题。

  内存泄漏并非指内存从物理上消失,而是指程序在运行过程中,由于疏忽或错误而失去了对该内存的控制,从而造成了内存的浪费。

  内存泄漏主要指堆上分配的变量,因为栈中分配的变量,随着函数退出时会自动回收。而堆是动态分配的,一旦用户申请了内存分配而为及时释放,那么该部分内存在整个程序运行周期内都是被占用的,其他程序无法再使用这部分内存。

  内存泄漏主要指堆上分配的变量,因为栈中分配的变量,随着函数退出时会自动回收。而堆是动态分配的,一旦用户申请了内存分配而为及时释放,那么该部分内存在整个程序运行周期内都是被占用的,其他程序无法再使用这部分内存

  对于实际的程序来说,我们在调用过程中使用 malloc、calloc、realloc、new 等分配内存时,使用完后要调用相应的 free 或 delete 释放内存,否则这块内存就会造成内存泄漏。当然在实际应用中,我们可能在使用系统资源或者在堆中创建对象时,没有及时将这些资源或者对象进行释放时,也会造成内存泄漏,这些资源或者对象的创建实际也占用了堆中的内存,在使用完成时应及时将其进行释放。

  由于内存未得到及时释放,从而可能导致可使用的动态内存空间会越来越少,一旦内存空间全部使用完,则程序可能会导致因为内存不够中止运行。由于内存泄漏导致的问题比较严重,现在许多语言都带有 GC 程序会自动对不使用的内存进行回收,从而避免内存泄漏。

 避免内存泄露的方法:对于 C/C++ 没有 GC 程序的语言来说因为内存造成的问题较多,当然一般情况下如果存在严重的内存泄漏,我们通过查看内存使用统计即可检测到内存泄漏,但是细小的内存泄漏很难通过统计观察到,目前一般都是利用各种内存检测工具来检测内存泄漏,当然关键还是在于统计和分析申请和释放的相关日志。内存检测工具有很多,这里重点介绍下 valgrind 。

posted @ 2022-10-15 21:07  Ace-GJH  阅读(134)  评论(0编辑  收藏  举报