【问题标题】:IOS removes allocated memory in native libraryIOS 删除本机库中分配的内存
【发布时间】:2015-10-15 22:00:51
【问题描述】:

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

在服务器 alloc 中,我分配结构 struct1struct2 然后在初始化函数中我尝试访问

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

我注意到我的 struct1 始终为空

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

我也试过关掉ARC,还是没有变化

【问题讨论】:

  • 你需要展示struct1是如何分配的以及它是如何声明的。
  • stuct1 被分配为 calloc (1, stuct1_size);
  • 我想你需要展示 abcInitialize: 的样子。因为在您当前的代码中,您没有为top 指针分配内存,而是为us 成员(top->us = ...)分配了一些东西。
  • 你从未分配过top
  • (你需要展示一些实际的代码。)

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


【解决方案1】:
top->us = calloc(TYPE_US, size_of(struct us));
if(top->us->struct1) //do something 

我注意到我的 struct1 总是为空

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

【讨论】:

  • struct1 已分配。这不是真正的代码。真正的代码适用于所有平台,IOS没有做任何更改
【解决方案2】:

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

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

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

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

作为结论。你看到的结果确实和预期的一样。

【讨论】:

  • 当我调试时,内存分配得很好,我可以看到结构值完好无损。,在函数返回时,相同的结构被取消分配。我想知道为什么会出现这种奇怪的行为。
【解决方案3】:

我发现了这个问题,这是由于从不同的库中链接了同一个文件两次。我已经更正了我的库,这解决了我的问题。所以没有更新源代码。只是用正确的来源更正了这些库。 非常感谢您的支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 2013-12-27
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2019-09-17
    • 2018-03-25
    • 2018-09-21
    相关资源
    最近更新 更多