与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,仍然没有改变
答案 0 :(得分:7)
top->us = calloc(TYPE_US, size_of(struct us)); if(top->us->struct1) //do something
我注意到我的struct1始终为null
如果这是您的真实代码,那么是的,struct1
将永远为空。 calloc
分配内存并将其初始化为零。因此,top->us
成员的所有将为零,并且由于struct1
是top->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。 非常感谢您的支持。