工作中使用valgrind检测内存泄露时,发现getifaddrs()很容易导致内存泄露,下面是正确的代码:
//get local ip of network card
//gcc -g get_addr.c -o get_addr
//#include
#include
#include
#include
#include
#include
#include
#include
#include 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 IP address Netmask
");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(" %s", ip);}else{printf(" ");}if(NULL != (*ifc).ifa_netmask){inet_ntop(AF_INET, &(((struct sockaddr_in*)((*ifc).ifa_netmask))->sin_addr), nm, 64);printf(" %s", nm);}else{printf(" ");}printf("
");}//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
关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,...
/*
使用正态分布变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据
*/
#include
#include
#include
#include
#include
awk格式化使用printf函数,类似于C语言中的printf函数 比如 awk '{printf "%s ", $1}' test1 上面的方式是awk每次处理一行,然后进行替换的,如果我们想要传入多个参数,此时就需要多个格式化...
【目的】 定义一个结构体类,其中的成员变量数组长度不定,根据实例化的对象指定长度,所以想到用指针实现 【现状】 指针可以指向任意长度数组,但结构体类只分配指针本身4字节长度,所以无法扩展 1 /** 2 *****************************************************...
1.有一个四位正整数,组成这个四位数的四个数字各不相同,如果把它们的首尾互换,第二位与第三位互换,组成一个新的四位数。原四位数为新四位数的4倍,请找出一个这样的四位数。 #include
if条件语句 非零即真 0即假 if(表达式){ //成立之后要处理的事情 } 以atm小程序为例 //判断用户选择的操作 if (operation == 1){ //输入密码 printf("输入密码 "); } if (operation...