【问题标题】:how would the memory management work for the C pointer in ObjectiveCObjective C 中的 C 指针的内存管理如何工作
【发布时间】:2012-07-22 23:55:32
【问题描述】:

对于以下代码,本质上,我们在 ObjectiveC 中调用 C 函数(funca 和 funcb)并使用 C 指针 pX。出于某种原因,我们在调用 funcb 时点击了 EXC_BAD_ACCESS,我们认为这可能与 pX 被释放或其他一些内存问题有关。所以问题是,这里可能出了什么问题?如果真的是因为那个 pX 提前发布了,我们怎么能修复它呢?在 ObjectiveC 中做 C 的一般做法是什么,就像这个场景一样?

.h

@interface MyObject : NSObject {
    X *pX;
}

.m

// calling funca and get the value pX properly set
if (funca(&pX) != 0) {
    // error;
}

// use the pX returned from funca
funcb(pX, ...);

【问题讨论】:

  • funca 是什么样的?我怀疑funca(&pX) 这条线 :) 你在哪里为*pX 分配内存-C 分配没有ARC,所以如果它提前发布,那是因为你调用了free
  • 我们不拥有 funca 和 funcb,它们来自 3rd 方库。 *pX 在funca内部分配。
  • 哦。在那种情况下,看起来你做得对:) 你是否 100% 确定 MyObject 没有被释放(提前发布等?)
  • MyObject 被保留,所以我很确定它当时没有发布。 :) 会不会是某种内存对齐问题导致 EXC_BAD_ACCESS 问题?
  • 作为健全性检查,我会在调用funca 之前立即将pX 初始化为NULL,然后立即记录其值(使用%#x 格式)。在调用 funcb 之前重复此过程(假设调用在不同的范围内)。

标签: objective-c c pointers memory-management


【解决方案1】:

在“Objective C”中使用 C 和在其他任何地方使用 C 没有区别。 Vanilla C 指针存在于 Objective C 引用计数系统之外,因此它们永远不会被释放。他们是malloc()'d 和free()'d。我会验证 funca 是否正确地完成了它的工作,或者可能会发布更多代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多