返回信息流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方式有区别吗
这是一条镜像帖。来源:北邮人论坛 / cpp / #93041同步于 2016/8/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
这两种free方式有区别吗?
mengliluohua
2016/8/11镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
第一种只是把结构体free了,但是结构体里面指针指向的还在;第二种是完全的free掉了吧。
Linux上感觉怎么用的都有,有的时候是需要其他的逻辑来保证结构体内部的内容被free的。
感觉楼主的对比有点问题,根本不是一个级别上的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);
}
```