IOS移除本地库中分配的内存

5
在与 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...);

在服务器内部,我做了结构体struct1struct2的分配。然后,在Initialize函数中,我尝试进行访问。

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

我发现我的结构体struct1总是为空

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

我尝试关闭ARC,但仍然没有改变


你需要展示如何分配和声明struct1。 - bbum
我猜你需要展示一下abcInitialize:的样子。因为在你当前的代码中,你没有为top指针分配内存,但是却给us成员赋值了(top->us = ...)。 - John Tracid
以下是编程相关的内容,需要将其从英文翻译成中文。请只返回翻译后的文本:(你需要展示一些实际代码。) - Hot Licks
已编辑代码。原生代码在Linux和Android上完全可用,因此原生代码无需更改。我想了解在这种情况下IOS的内存配置。 - blganesh101
abcInitialize代码是Objective-C吗?另外,C代码是非托管的。很可能分配只在调度块的范围内有效。这可能是弱引用导致的吗? - Omar
显示剩余3条评论
3个回答

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

I noticed that my struct1 is always null

如果这是您的真实代码,那么是的,struct1 将始终为 null。 calloc 分配内存并将其初始化为零。因此,top->us所有成员都将为零,因为 struct1top->us 的成员之一,所以它将为零,即 NULL

struct1已被分配。这不是真正的代码。真正的代码适用于所有平台,且未对IOS进行任何更改。 - blganesh101

4
首先,ARC与C或C++代码的内存管理无关,因此,你可以排除ARC导致此问题。
根据http://www.cplusplus.com/reference/cstdlib/calloc/,calloc总是将分配的内存的所有位初始化为0,自然而然地,top->us->struct1将为NULL。
但在从函数返回之前,内存会自动释放。
你是如何得出内存会自动释放的结论的?如上所述,ARC不会自动释放你的C++结构/对象。
作为结论。你看到的结果确实符合预期。

当我进行调试时,内存分配得很好,我可以看到结构值完整。但是在函数返回时,相同的结构被释放了。我想知道这是为什么出现了奇怪的行为。 - blganesh101

0

我找到了问题所在,原因是从不同的库中两次链接了同一个文件。我已经纠正了我的库,这解决了我的问题。因此没有更新源代码,只是使用正确的源代码纠正了库。 非常感谢您的支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接