2011-03-24 153 views
3

至少我有点困惑。 ()函数getaddrinfo()调用'更新'指向addrinfo结构的指针,当我要在相同作用域(该函数)中使用addrinfo时,一切正常,但如果将结构复制到另一个结构(通过指定它) 。getaddrinfo addrinfo导致堆栈或堆栈

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

如果我错了,请纠正我: a)getaddrinfo()需要一个指向指向addrinfo的struct指针的指针。 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 &更新似乎不起作用,因为问题依然存在:功能范围结束后,原来的结构被摧毁。

任何人都可以在这里给我更多的了解(请解释一下什么被创建这里和销毁,其中,栈,堆所有的信息是值得欢迎的)

回答

6

原来的结构得到的作用范围结束后

号,结构体的指针被销毁销毁。其余的数据仍然在堆中。如果您在完成结果后不拨打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); 
+0

感谢您的反馈。纠正我,如果我错了:通常当我创建一个结构实例时,它会在堆栈右侧创建,并在当前范围完成后“清除”?所以getaddrinfo在这里是一个特例?有没有一种方法可以找到保存数据的功能? – 2011-03-24 19:58:09

+0

@Ger所有本地变量都在堆栈上,正确。但是你并没有创建'addrinfo'结构; 'getaddrinfo()'用'malloc()'为你创建结构,这就是它在堆中的原因。你正在创建的是**结构体的**指针**。当函数结束时,你的**指针**消失,但结构本身仍然在堆中。 – chrisaycock 2011-03-24 20:02:14

+0

这些可能是基本的问题;但所有其他的c函数更新结构指针工作在相同的方式? – 2011-03-24 20:04:49

1

getaddrinfo分配addrinfo结构列表,并为您的指针名单的头。通过将该指针传递给freeaddrinfo,释放所有分配的内存。

你在做什么是足够安全的,但泄漏内存。

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


addrinfo * myai; 
GetAddrInfo(&myai); 
freeaddrinfo(myai) 

这种方法不会泄露内存 - 你只是检索的指针addrinfo中的表头。

+0

我知道freeaddrinfo(),想使讨论清楚。所以你说这个结构在函数作用域结束后不会'无效'。所以实际上它不会被删除,直到我把头上的freeaddrinfo称为? – 2011-03-24 18:40:19

+0

@Ger Teunis:没错。这是从一些私人分配机制分配,并完全安全,直到你打电话给freeaddrinfo – Erik 2011-03-24 18:41:05

+0

@Ger Teunis:虽然,你不能'update'到freeaddrinfo - 它是res的字段的副本,它并没有指向原来的头名单。我会更新答案。 – Erik 2011-03-24 18:43:24