BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #93041同步于 2016/8/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

这两种free方式有区别吗?

mengliluohua
2016/8/11镜像同步15 回复
Linux下freeifaddrs函数有两种定义: 要free的是 typedef struct ifaddrs { struct ifaddrs *ifa_next; /* Next item in list */ char *ifa_name; /* Name of interface */ unsigned int ifa_flags; /* Flags from SIOCGIFFLAGS */ struct sockaddr *ifa_addr; /* Address of interface */ struct sockaddr *ifa_netmask; /* Netmask of interface */ union { struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */ struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */ } ifa_ifu; #define ifa_broadaddr ifa_ifu.ifu_broadaddr #define ifa_dstaddr ifa_ifu.ifu_dstaddr void *ifa_data; /* Address-specific data */ } ifaddrs; 1.一种是: void freeifaddrs(struct ifaddrs *ifp) { free(ifp); } 2.另一种是: void freeifaddrs(struct ifaddrs *ifp) { struct ifaddrs *p, *q; for(p = ifp; p; ) { if (p->ifa_name) free(p->ifa_name); if(p->ifa_addr) free(p->ifa_addr); if(p->ifa_dstaddr) free(p->ifa_dstaddr); if(p->ifa_netmask) free(p->ifa_netmask); if(p->ifa_data) free(p->ifa_data); q = p; p = p->ifa_next; free(q); } } 这两种free方式有区别吗
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2016/8/12
你说呢
FromSixToTen机器人#2 · 2016/8/12
母鸡。 【 在 nuanyangyang 的大作中提到: 】 : 你说呢
Vampire机器人#3 · 2016/8/12
实现都有了啊楼主……
cocoyimasa机器人#4 · 2016/8/12
暖神说的对
chenglong机器人#5 · 2016/8/12
这也能十大?[ema17]
virdefender机器人#6 · 2016/8/12
第一种只是把结构体free了,但是结构体里面指针指向的还在;第二种是完全的free掉了吧。 Linux上感觉怎么用的都有,有的时候是需要其他的逻辑来保证结构体内部的内容被free的。
meng714620机器人#7 · 2016/8/12
啊,暖神姐姐换头像了 【 在 nuanyangyang 的大作中提到: 】 : 你说呢
jh1机器人#8 · 2016/8/12
叫阿姨。 【 在 meng714620 的大作中提到: 】 : 啊,暖神姐姐换头像了
jh1机器人#9 · 2016/8/12
感觉楼主的对比有点问题,根本不是一个级别上的free! 第一个free只是free了一个node,比如说头节点之类 第二个free把整个链表都free了,我想楼主表达的意思应该如下: 第一种的方法: ``` void freeifaddrs(struct ifaddrs *ifp) { free(ifp); } ``` 第二种free ``` void freeifaddrs(struct ifaddrs *ifp) { struct ifaddrs *p = ifp; if (p->ifa_name) free(p->ifa_name); if(p->ifa_addr) free(p->ifa_addr); if(p->ifa_dstaddr) free(p->ifa_dstaddr); if(p->ifa_netmask) free(p->ifa_netmask); if(p->ifa_data) free(p->ifa_data); free(p); } ```