什么是内存泄漏?(What is a memory leak?)

程序中的内存泄漏是怎么回事呢?

我们写过很多带有关键词free()的程序。比如我在这篇博文关于链表的一些重要操作(Important operations on a Linked List)中删除整个链表用到这个函数,代码片断如下:

struct node * deleteList(struct node * head)
{
    struct node * temp;
    while(head != NULL)
    {
        temp = head;
        head = head -> next;
        free(temp);
    }
    return NULL;
}

我们在程序中分配内存时,程序结束后并不会自动释放手动分配的内存,所以我们也要手动去释放我们分配的内存。有些情况下程序会一直运行下去,那么就会发生内存泄漏。当程序员在堆中分配内存却忘了释放就会发生内存泄漏。对于像守护进程和服务器这样的程序设计之初就是长时间运行的程序内存泄漏是很严重的问题。

下面是会产生内存泄漏代码的例子:

void func()
{
    // in the below line we allocate memory
    int *ptr = (int *) malloc(sizeof(int));

    /* Do some work */

    return; // Return without freeing ptr
}
// We returned from the function but the memory remained allocated.
// This wastes memory space.

避免内存泄漏正确的代码:

void func()
{
    // We allocate memory in the next line
    int *ptr = (int *) malloc(sizeof(int));

    /* Do some work */

    // We unallocate memory in the next line
    free(ptr);

    return;
}

释放自己分配的内存在C语言中是一个好的习惯。

时间: 2024-11-08 06:15:41

什么是内存泄漏?(What is a memory leak?)的相关文章

LeakCanary 内存泄漏 监测 性能优化 简介 原理

GitHub:https://github.com/square/leakcanary Demo地址:https://github.com/baiqiantao/LeakCanaryTest.git 目录 目录简单使用更多介绍自定义 LeakCanary测试案例ApplicationMainActivity静态成员导致的内存泄漏单例导致的内存泄漏 简单使用 A memory leak detection 内存泄露检测 library for Android and Java. A small l

Linux C/C++ Memory Leak Detection Tool

目录 1. 内存使用情况分析 2. 内存泄漏(memory leak) 3. Valgrind使用 1. 内存使用情况分析 0x1: 系统总内存的分析 可以从proc目录下的meminfo文件了解到当前系统内存的使用情况汇总,其中可用的物理内存 = memfree + buffers + cached当memfree不够时,内核会通过回写机制(pdflush线程)把cached和buffered内存回写到后备存储器,从而释放相关内存供进程使用,或者通过手动方式显式释放cache内存:echo 3

_CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题

我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} normal block at 0x05785AD0, 152 bytes long. Data: << N N x 7 > 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00 Object dump complete.   而且每次退出都是一样的.

简单内存泄漏检测方法 解决 Detected memory leaks! 问题

最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} normal block at 0x05785AD0, 152 bytes long. Data: << N N x 7 > 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00 Object dump complete.   而且每次退出都是一样的.泄漏的内存块都是98500. 解决方法: 1.

内存泄漏以及常见的解决方法

  之所以撰写这篇文章是由于前段时间花费了非常大的精力在已经成熟的代码上再去处理memory leak问题.写此的目的是希望我们应该养成良好的编码习惯,尽可能的避免这种问题,由于当你对着一大片的代码再去处理此类的问题,此时无疑添加了解决的成本和难度.准确的说属于补救措施了. 1. 什么是内存泄漏(memory leak)?  指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内

最快速度找到内存泄漏

确认是否存在内存泄漏 我们知道,MFC程序如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏.例如: class CMyApp : public CWinApp{public:   BOOL InitApplication()   {       int* leak = new int[10];       return TRUE;   }}; 产生的内存泄漏报告大体如下: Detected memory leaks!Dumping objects ->c:worktest.cpp(

VC下调试内存泄漏的办法

VC的控制台程序不会跟踪内存泄漏,如果需要调试控制台程序的内存情况,需要_CrtSetDbgFlag 详细原理我也不太懂,我也是从网上摘过来的,直接帖代码 // 内存泄漏跟踪 #ifdef WIN32 #include <SDKDDKVer.h> #ifdef _DEBUG #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #define VC_MemLeakCheck() _CrtSet

(转)最快速度找到内存泄漏

最快速度找到内存泄漏 许式伟 2006年11月某日 内存管理是C++程序员的痛.我的<内存管理变革>系列就是试图讨论更为有效的内存管理方式,以杜绝(或减少)内存泄漏,减轻C++程序员的负担.由于工作忙的缘故,这个系列目前未完,暂停. 这篇短文我想换个方式,讨论一下如何以最快的速度找到内存泄漏. 1.确认是否存在内存泄漏 我们知道,MFC程序如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏.例如: class CMyApp : public CWinApp { public: BO

在 JNI 编程中避免内存泄漏

JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java Heap 的内存泄漏 Java 对象存储在 JVM 进程空间中的 Java Heap 中,Java Heap 可以在 JVM 运行过程中动态变化.如果 Java 对象越来越多,占据 Java Heap 的空间也越来越大,JVM 会在运行时扩充 Java Heap 的容量.如果 Java Heap 容量

最快速度找到内存泄漏[转载]

转载链接:http://blog.csdn.net/eric_jo/article/details/4264442 内存管理是C++程序员的痛.我的<内存管理变革系列>就是试图讨论更为有效的内存管理方式,以杜绝(或减少)内存泄漏,减轻C++程序员的负担. 这篇短文我想换个方式,讨论一下如何以最快的速度找到内存泄漏. 确认是否存在内存泄漏 我们知道,MFC程序如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏.例如: class CMyApp : public CWinApp { p