工作中使用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()函数避免内存泄露相关推荐

  1. 【Tools】Linux下C和C++程序中内存泄露检测

    00. 目录 文章目录 00. 目录 01. 前言 02. valgrind安装 03. 使用未初始化的内存 04. 使用野指针 05. 动态内存越界访问 06. 分配空间后没有释放 07. 不匹配使 ...

  2. linux释放内存函数,LINUX上的getifaddrs()函数的内存释放有关问题

    LINUX上的getifaddrs()函数的内存释放有关问题 LINUX上的getifaddrs()函数的内存释放有关问题 日期:2014-05-16 浏览次数:20386 次 LINUX下的geti ...

  3. Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)

    1.exit()函数 exit(int n)  其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...

  4. Linux 下调用UEFI的函数

    Linux 下调用UEFI的函数 摘要 Linux 调用UEFI function 时候调用约定的转换 64bits calling convention Microsoft calling conv ...

  5. 在Linux下正确安装VMWARE TOOLS

    在Linux下正确安装VMWARE TOOLS 1.以ROOT身份进入LINUX 2.按下CTRL+ALT组合键,进入主操作系统,点击VMWARE状态栏安装提示,或者点击SETTING菜单下的ENAB ...

  6. linux uname内核,Linux下confstr与uname函数_获取C库与内核信息

    Linux下confstr与uname函数_获取C库与内核信息 #include #include  //uname int main(int argc, char **argv[]) { struc ...

  7. java 收集系统资源_方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息

    CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTok ...

  8. linux下查看服务器的cpu、内存大小、硬盘大小

    linux下查看服务器的cpu.内存大小.硬盘大小 今天查服务器硬件情况,上网搜到了这篇文章,感觉很好,自己定个坐标. 我看的原文地址 https://www.cnblogs.com/li-shuai ...

  9. Linux系统怎么编译sin,linux下gcc编译sin函数出错的问题

    linux下gcc编译sin函数出错的问题 收藏 Q: I keep getting errors due to library functions being undefined, but I'm ...

最新文章

  1. 用C语言写PHP扩展
  2. UseCase事件描述叙事流规范
  3. mips汇编计算开方_清华考研辅导班-2020清华大学912计算机专业基础综合考研经验真题参考书目...
  4. python zookeeper_ZooKeeper的安装以及客户端Kazoo(Python语言)的安装与使用
  5. matlab 的cat函数
  6. php中节点值怎么获取,php – 节点更新:获取旧值
  7. RTT学习笔记6-内存管理
  8. 可视化—解决graphviz保存决策树中文乱码问题
  9. EasyRecovery如何恢复javascript文件
  10. 支持向量机(Support Vector Machine,SVM)—— 线性SVM
  11. Oracle 区管理和段空间管理小结
  12. linux双系统grub引导修复工具,双系统引导grub简单备份及修复
  13. SCM系统是什么?供应链管理系统有哪些优势?
  14. P-NUCLEO-IHM001 板载STLINK 驱动安装
  15. 服务器lsass系统错误,lsass.exe-系统错误,终结点格式无效 windows2003服务器出错
  16. 【计算机网络】光纤传输的全反射
  17. 计算机管理员密码忘记了怎么恢复,新版tplink(tplogin.cn)管理员密码忘记了怎么办?...
  18. 深度学习模型与湿实验的结合,有望用于代谢通量分析
  19. nginx配置详解(容器、负载)—官方原版
  20. OpenCV Gabor滤波器实现纹理提取与缺陷分析

热门文章

  1. [ME]不知道第几次学c语言,仍觉得水深莫测
  2. Xcode中如何解决无法使用svn命令行的问题
  3. 需要反射时使用dynamic
  4. 域中计算机设定重启,域中添加计算机设定的步骤
  5. 基于FCN,U-Net的深度学习医学影像分割算法(细胞分割算法)以及传统算法分析
  6. usaco Postal Vans(dp)
  7. 龙岩学院计算机二级报名时间,福建龙岩学院2015年12月计算机等级考试报名通知...
  8. html如何给文字添加阴影效果,css中怎么给字体添加阴影效果
  9. 铜陵新松工业机器人项目_投资10亿元,茶山德威工业机器人和精密模具项目动工...
  10. linux 内核调试信息在哪里,Linux kernel debug技巧----开启DEBUG选项