GNU glibc中对C语言标准库中动态内存管理的改进
来源:互联网 发布:诺曼鲍威尔体测数据 编辑:程序博客网 时间:2024/05/21 17:54
先看一段前面展示过的代码:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include"stdlib.h"
int file_exists(const char *dirpath, const char *filename)
{
size_t len = 1+ strlen (dirpath) + 1+strlen (filename);
char * filepath = (char *) malloc (len);
int result;
if (filepath == 0)
perror ("malloc");
sprintf (filepath, "%s/%s",dirpath, filename);
/* Invert the return status of access tobehave like a boolean. */
result = 1+ access (filepath, F_OK);
free (filepath);
return result;
}
int main(void)
{
if(file_exists("./","mem.c"))
{
printf("fileexists!\n");
}
return 0;
}
这段代码的功能是实现文件存在性的检测,其中用到了C语言的动态内存分配与回收。在使用了malloc之后,必须得有一次对free的匹配调用。否则就会造成内存被分配却无法使用的情况。而这种调用上成对儿出现的要求增加了编码的难度,也容易引入一些严重的问题。GNU glibc在某些方面上进行了改进,针对以上代码的修改如下:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include"stdlib.h"
#include"malloc.h"
int file_exists(const char *dirpath, const char *filename)
{
size_t len = 1+ strlen (dirpath) + 1+strlen (filename);
char * filepath = (char *) alloca (len);
int result;
if (filepath == 0)
perror ("alloca");
sprintf (filepath, "%s/%s",dirpath, filename);
/* Invert the return status of access tobehave like a boolean. */
result = 1+ access (filepath, F_OK);
/*
free (filepath);
*/
return result;
}
int main(void)
{
if(file_exists("./","mem.c"))
{
printf("fileexists!\n");
}
return 0;
}
这样,在需要进行动态内存分配的时候只需要进行内存的分配而不需要关注内存的回收。在相应的内存使用结束之后,内存会自动被回收。代码的编译以及程序的执行结果如下:
E:\01_workSpace\02_programme_language\01_clang\2017\08\08>gccmem_gnu.c
E:\01_workSpace\02_programme_language\01_clang\2017\08\08>a
file exists!
值得注意的是,虽说是这个功能存在于GNUglibc,但是很多移植后的版本中函数的声明文件可能会有不同,这个还是得根据实际的情况进行修改。
- GNU glibc中对C语言标准库中动态内存管理的改进
- glibc中内存管理
- 覆盖GNU C库中调试glibc函数
- C语言标准库之动态内存管理
- 2.2.2 GNU C对标准C语言的扩展
- C语言中inet_ntoa()的内存管理
- C语言中内存的管理
- 我是这样学习Linux下C语言编程的-完全认识GNU C 语言库glibc
- 我是这样学习Linux下C语言编程的-完全认识GNU C 语言库glibc
- c语言中内存管理
- 标准C语言库 Glibc 2.15
- linux内核中GNU C和标准C的区别
- C语言中标准内存分配函数
- C语言中内存的动态管理——malloc和free
- 在C#中调用C语言标准动态库方法
- 【C/C++开发】C语言 DLL(动态链接库)中申请动态内存释放的问题
- gnu c标准中typeof关键字
- C语言中 对变量内存关系的探讨
- Spark版本说明
- 指针
- JavaNIO实现文件复制
- 啥是中国互联网大会
- VMware 虚拟机的虚拟磁盘编程知识点扫盲之一
- GNU glibc中对C语言标准库中动态内存管理的改进
- 解决乌班图16.04和mint18.1在联想笔记本无法打开无线WiFi开关的方法
- ES6 => 箭头函数
- Maven概述(一)
- 数学建模--插值和拟合实例
- [LeetCode] 567. Permutation in String
- ListIterator和Iterator的区别与联系
- RecycleView 获取第一个可见条目(掉坑篇)
- Head Fiest Python读书笔记