C语言内存分配管理常见bug

标准C库提供了4个内存管理函数:malloc、calloc、realloc和free。

bug1

调用free释放p指向的内存块之后,p就是一个悬挂指针——指向逻辑上不存在的内存的指针。如果引用这个悬挂指针,会导致不可预见的错误。

ElemType* p = (ElemType*)malloc(sizeof(ElemType) * NUM);
...
free(p);// p = NULL;
...
*p = "...";

bug2

释放空闲内存,破坏内存管理函数所用的数据结构。

ElemType* p = (ElemType*)malloc(sizeof(ElemType) * NUM);
...
free(p);
...
free(p);

bug3

释放并非malloc、calloc或realloc分配的内存。

ElemType buf[20], *p;
if(n >= sizeof(buf){
    p = (ElemType*)malloc(sizeof(ElemType) * NUM);
}else{
    p = buf;
}
...
free(p);

bug4

1、没有考虑内存分配不成功的情况。如果分配失败应返回NULL;
2、使用后没有释放内存,多次调用会导致内存泄漏;

void itoa(int n, char *buf, int size){
    char *p = malloc(43);

    sprintf(p, "%d", n);
    if(strlen(p) >= size-1){//如果数字个数大于size-1时,用*填充。
        while(--size > 0){
            *buf++ = '*';
        }
        *buf = '\0';
    }else{
        strcpy(buf, p);
    }
}

初学者更容易犯下面的错误。itoa试图返回buf的内容,但itoa返回后,buf已经被清空了。

char *itoa(int n){
    char buf[43];

    sprintf(buf, "%d", n);
    return buf;
}

Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《C语言内存分配管理常见bug》: http://blog.csdn.net/u014134180/article/details/78335307

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。

时间: 2024-10-14 05:20:07

C语言内存分配管理常见bug的相关文章

SQL SERVER 内存分配及常见内存问题(1)——简介

原文:SQL SERVER 内存分配及常见内存问题(1)--简介 一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加:       首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解SQL SERVER与windows是如何协调.共享内存.并且SQL SERVER的内部对内存的管理机制. 2.在Windows 2003以上版本运行的SQL Server,内存使用量突然急剧下降:      内存是Sqlserver的生命线.在errorlog中,出现一下情况:   

SQL SERVER 内存分配及常见内存问题(2)——DMV查询

原文:SQL SERVER 内存分配及常见内存问题(2)--DMV查询 内存动态管理视图(DMV): 从sys.dm_os_memory_clerks开始. SELECT [type] , SUM(virtual_memory_reserved_kb) AS [VM Reserved] , SUM(virtual_memory_committed_kb) AS [VM Committed] , SUM(awe_allocated_kb) AS [AWE Allocated] , SUM(shar

c语言-C语言内存分配malloc导致的程序退出

问题描述 C语言内存分配malloc导致的程序退出 char *p; while (1) { p = malloc(1); *p = 0; } 这样写最后是因为没有内存退出还是向0写入退出?怎么感觉是内存完了 解决方案 内存分配失败就会返回空指针 解决方案二: 堆内存被使用完后,在申请就睡失败,p就是NULL,即地址为0写入,而这个地址是受程序保护的,无法写入因此退出 解决方案三: 个人觉得你这个应该是会导致堆内存不够,导致程序异常退出

关于c语言内存分配,malloc,free,和段错误,内存泄露

1.   C语言的函数malloc和free  (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数        void * malloc(size_t size) 动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL.        void  free(void *ptr) 释放动态申请的内存空间,调用free()后ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果ptr为NULL,

SQL SERVER 内存分配及常见内存问题 简介

一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加:       首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解SQL SERVER与windows是如何协调.共享内存.并且SQL SERVER的内部对内存的管理机制. 2.在Windows 2003以上版本运行的SQL Server,内存使用量突然急剧下降:      内存是Sqlserver的生命线.在errorlog中,出现一下情况:       这类问题往往不是sql server导致的,而是Window

Yarn 内存分配管理机制及相关参数配置

理解Yarn的内存管理与分配机制,对于我们搭建.部署集群,开发维护应用都是尤为重要的,对于这方面我做了一些调研供大家参考. 关于Yarn的详细介绍请参考[Hadoop Yarn详解] 一.相关配置情况 关于Yarn内存分配与管理,主要涉及到了ResourceManage.ApplicationMatser.NodeManager这几个概念,相关的优化也要紧紧围绕着这几方面来开展.这里还有一个Container的概念,现在可以先把它理解为运行map/reduce task的容器,后面有详细介绍.

C语言内存分配与释放的详解

什么是堆?说到堆,又忍不住说到了栈!什么是 栈? 1.什么是堆:堆是大家共有的空间,分全局堆和局部堆.全局堆就是所有没有分配的空间,局部堆就是用户分配的空间.堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏. 2.什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的.栈在线程开始的时候初始化,每个线程的栈互相独立.每个函数都有自己的栈,栈被用来在函数之间传递参数.操作系统在切换线程的时候会自动的切换栈,就是切换SS/ES

jemalloc 5.0.0 全新版本发布,内存分配管理

jemalloc 发布了全新的 5.0.0 版本.与以前所有的版本不同,新版本不使用自然对齐的"chunks"进行虚拟内存管理,而是使用页面对齐的"extents". jemalloc 是一个通用的 malloc(3)实现,它强调了分段回避和可伸缩并发支持.jemalloc 在 2005 年首次作为 FreeBSD libc 分配器使用,2010年,jemalloc 的功能延伸到如堆分析和监控/调优等.现代的 jemalloc 版本依然集成在 FreeBSD 中.

深入解析C语言中的内存分配相关问题_C 语言

C内存分配区域 程序代码区存放函数体的二进制代码 全局数据区全局变量和静态变量的存储是放在一起的.初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.常量数据存放在另一个区域里.这些数据在程序结束后由系统释放.我们所说的BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称 栈区由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据