IOS删除本机库

时间:2015-07-25 07:08:26

标签: c++ ios objective-c c memory-management

与c / c ++库集成时IOS中的奇怪行为。

在AppDelegate中我打电话

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{
    [[ABCService sharedInstance] abcInitialize];
});

abcInitialize在c ++库中定义

struct abc *top;
top = calloc(TYPE_SERV,size_of(struct abc));
top->us = server_alloc (...certain_params...);

在服务器内部我做了结构 struct1 struct2 的分配 然后在Initialize函数中我尝试访问

top->us = calloc(TYPE_US, size_of(struct us));
if(top->us->struct1) //do something

我注意到我的struct1始终为null

当我调试时,我可以看到结构被正确分配并且值被适当地设置,但在从函数返回之前,内存被自动释放。 这完全令人困惑和烦人。 任何人都可以帮我理解发生了什么吗?

我也试过关闭ARC,仍然没有改变

3 个答案:

答案 0 :(得分:7)

top->us = calloc(TYPE_US, size_of(struct us));
if(top->us->struct1) //do something 
     

我注意到我的struct1始终为null

如果这是您的真实代码,那么是的,struct1将永远为空。 calloc分配内存并将其初始化为零。因此,top->us成员的所有将为零,并且由于struct1top->us的成员,因此它将为零,即{{1} }}

答案 1 :(得分:4)

首先,ARC与C或C ++代码的内存管理无关,因此,您可以排除ARC导致此问题。

根据http://www.cplusplus.com/reference/cstdlib/calloc/,calloc始终将分配的内存的所有位初始化为0,当然,top-> us-> struct1将为NULL。

  

但在从函数返回之前,内存是自动的   解除分配的

您如何得出内存自动解除分配的结论?如上所述,ARC不会自动释放您的C ++结构/对象。

作为结论。你看到的结果确实符合预期。

答案 2 :(得分:0)

我发现了这个问题,这是因为从不同的库中连接了两次相同的文件。我已经纠正了我的库,这解决了我的问题。所以没有更新源代码。用正确的来源纠正了libs。 非常感谢您的支持。