Linux下正确使用getifaddrs()函数避免内存泄露
工作中使用valgrind检测内存泄露时,发现getifaddrs()很容易导致内存泄露,下面是正确的代码:
//get local ip of network card
//gcc -g get_addr.c -o get_addr
//#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ifaddrs.h>int main(int argc, char* argv[]){struct ifaddrs *ifc, *ifc1;char ip[64] = {};char nm[64] = {};if(0 != getifaddrs(&ifc)) return -1;ifc1 = ifc;printf("iface\tIP address\tNetmask\n");for(; NULL != ifc; ifc = (*ifc).ifa_next){printf("%s", (*ifc).ifa_name);if(NULL != (*ifc).ifa_addr) {inet_ntop(AF_INET, &(((struct sockaddr_in*)((*ifc).ifa_addr))->sin_addr), ip, 64);printf("\t%s", ip);}else{printf("\t\t");}if(NULL != (*ifc).ifa_netmask){inet_ntop(AF_INET, &(((struct sockaddr_in*)((*ifc).ifa_netmask))->sin_addr), nm, 64);printf("\t%s", nm);}else{printf("\t\t");}printf("\n");}//freeifaddrs(ifc);freeifaddrs(ifc1);return 0;
}
编译方法:
gcc -g get_addr.c -o get_addr
运行和检测如下:
但是如果将末尾的ifc1更改为ifc,就会造成内存泄露, 真正的原因是, ifc不是真正的链表, 仅是伪链表.参见下面的参考文献[1].
参考文献
[1].http://xinzhiwen198941-163-com.iteye.com/blog/994704
[2].http://blog.csdn.net/bailyzheng/article/details/7489656
Linux下正确使用getifaddrs()函数避免内存泄露相关推荐
- 【Tools】Linux下C和C++程序中内存泄露检测
00. 目录 文章目录 00. 目录 01. 前言 02. valgrind安装 03. 使用未初始化的内存 04. 使用野指针 05. 动态内存越界访问 06. 分配空间后没有释放 07. 不匹配使 ...
- linux释放内存函数,LINUX上的getifaddrs()函数的内存释放有关问题
LINUX上的getifaddrs()函数的内存释放有关问题 LINUX上的getifaddrs()函数的内存释放有关问题 日期:2014-05-16 浏览次数:20386 次 LINUX下的geti ...
- Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)
1.exit()函数 exit(int n) 其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...
- Linux 下调用UEFI的函数
Linux 下调用UEFI的函数 摘要 Linux 调用UEFI function 时候调用约定的转换 64bits calling convention Microsoft calling conv ...
- 在Linux下正确安装VMWARE TOOLS
在Linux下正确安装VMWARE TOOLS 1.以ROOT身份进入LINUX 2.按下CTRL+ALT组合键,进入主操作系统,点击VMWARE状态栏安装提示,或者点击SETTING菜单下的ENAB ...
- linux uname内核,Linux下confstr与uname函数_获取C库与内核信息
Linux下confstr与uname函数_获取C库与内核信息 #include #include //uname int main(int argc, char **argv[]) { struc ...
- java 收集系统资源_方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息
CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTok ...
- linux下查看服务器的cpu、内存大小、硬盘大小
linux下查看服务器的cpu.内存大小.硬盘大小 今天查服务器硬件情况,上网搜到了这篇文章,感觉很好,自己定个坐标. 我看的原文地址 https://www.cnblogs.com/li-shuai ...
- Linux系统怎么编译sin,linux下gcc编译sin函数出错的问题
linux下gcc编译sin函数出错的问题 收藏 Q: I keep getting errors due to library functions being undefined, but I'm ...
最新文章
- 用C语言写PHP扩展
- UseCase事件描述叙事流规范
- mips汇编计算开方_清华考研辅导班-2020清华大学912计算机专业基础综合考研经验真题参考书目...
- python zookeeper_ZooKeeper的安装以及客户端Kazoo(Python语言)的安装与使用
- matlab 的cat函数
- php中节点值怎么获取,php – 节点更新:获取旧值
- RTT学习笔记6-内存管理
- 可视化—解决graphviz保存决策树中文乱码问题
- EasyRecovery如何恢复javascript文件
- 支持向量机(Support Vector Machine,SVM)—— 线性SVM
- Oracle 区管理和段空间管理小结
- linux双系统grub引导修复工具,双系统引导grub简单备份及修复
- SCM系统是什么?供应链管理系统有哪些优势?
- P-NUCLEO-IHM001 板载STLINK 驱动安装
- 服务器lsass系统错误,lsass.exe-系统错误,终结点格式无效 windows2003服务器出错
- 【计算机网络】光纤传输的全反射
- 计算机管理员密码忘记了怎么恢复,新版tplink(tplogin.cn)管理员密码忘记了怎么办?...
- 深度学习模型与湿实验的结合,有望用于代谢通量分析
- nginx配置详解(容器、负载)—官方原版
- OpenCV Gabor滤波器实现纹理提取与缺陷分析
热门文章
- [ME]不知道第几次学c语言,仍觉得水深莫测
- Xcode中如何解决无法使用svn命令行的问题
- 需要反射时使用dynamic
- 域中计算机设定重启,域中添加计算机设定的步骤
- 基于FCN,U-Net的深度学习医学影像分割算法(细胞分割算法)以及传统算法分析
- usaco Postal Vans(dp)
- 龙岩学院计算机二级报名时间,福建龙岩学院2015年12月计算机等级考试报名通知...
- html如何给文字添加阴影效果,css中怎么给字体添加阴影效果
- 铜陵新松工业机器人项目_投资10亿元,茶山德威工业机器人和精密模具项目动工...
- linux 内核调试信息在哪里,Linux kernel debug技巧----开启DEBUG选项