getaddrinfo addrinfo导致堆栈或堆

至少我有点困惑。 getaddrinfo()调用’updates’指向addrinfo结构的指针,当我要在相同的范围(该函数)中使用addrinfo时,一切都很好但是如果我将结构复制到另一个(通过分配它)会发生什么。

请帮助我理解正在进行的基础知识(不寻求替代方法的建议)。

如果我错了,请纠正我:a)getaddrinfo()需要指向addrinfo的struct-pointer的指针。 b)getaddrinfo在当前函数作用域中创建addrinfo结构并更新a)中所需的指针

现在我真正的问题是:我想将addrinfo存储在其他地方。 使用分配给另一个指针不会执行深层复制,并且在该函数之后所有指针都变为无效?

最好给出一个非常简单的例子:

void GetAddrInfo(struct addrinfo *update) { struct addrinfo *res; getaddrinfo(xx,xx,xx,&res); //is this save? After this 'scope' ends all pointed fields are invalid? //this doesn't copy the linked list ai_next. *update=*res; } 

直接使用和更新getaddrinfo似乎不起作用,因为问题仍然存在:原始结构在函数范围结束后被销毁。

任何人都可以在这里给我更多的见解(请解释在哪里创建的内容和销毁位置,堆栈,堆欢迎所有信息)

函数作用域结束后,原始结构被销毁

不,struct的指针被销毁了。 其余的数据仍在堆中。 如果你在完成结果时没有调用freeaddrinfo() ,这将是内存泄漏。

我想将addrinfo存储在其他地方

由于数据仍然存在,随意复制指针; 不需要深层复制。 从你的例子:

 void GetAddrInfo(struct addrinfo **update) /* pointer to pointer */ { struct addrinfo *res; getaddrinfo(xx,xx,xx,&res); *update=res; /* save the pointer to the struct */ } 

您只需使用以下命令调用此函数:

 struct addrinfo *mycopy; GetAddrInfo(&mycopy); 

getaddrinfo分配addrinfo结构列表,并为您提供指向列表头部的指针。 完成后,通过将此指针传递给freeaddrinfo来释放所有已分配的内存。

你正在做的事情足够安全,但会泄漏记忆。

 void GetAddrInfo(struct addrinfo **update) { getaddrinfo(xx,xx,xx,update); } addrinfo * myai; GetAddrInfo(&myai); freeaddrinfo(myai) 

这种方法不会泄漏内存 – 您只需检索指向addrinfo列表头的指针。