【问题标题】:Can't free linked list in objective-C iPhone dev无法在objective-C iPhone dev中释放链表
【发布时间】:2011-05-17 11:22:13
【问题描述】:

我正在为 iPhone 编写一个应用程序,它使用链表来跟踪一组点。我在其他 C 程序中一次又一次成功地使用了链表,但我从未在 iPhone 上使用过链表,而且我的“freeList”函数崩溃了。

pointNode * temp;

pointTrain = lPoints->next;
while (pointTrain) {
    temp = pointTrain->next;
    free(pointTrain);
    pointTrain = temp;
}

这就是我释放列表的方式,'lPoints' 是头部,并且总是在运行时分配。此代码在添加更多节点之前执行,但即使“pointTrain”为 NULL,它似乎仍会执行,这应该使其跳过 while 循环。可惜循环还在执行,程序在free(pointTrain)上崩溃了

有什么我没看到的吗?

点是在循环中添加的:

pointTrain->x = onPx / trueWidth;
pointTrain->y = onPx % trueWidth;
pointTrain->next = (pointNode*)malloc(sizeof(pointNode));
pointTrain = pointTrain->next;

【问题讨论】:

  • 什么是pointNode?是 C-Struct、Objective-C 类还是 C++ 结构/类?
  • 为什么不使用 NSMutableArray 之类的?
  • Obj-C 是 C 的严格超集。如果您用 C 编写了链表,它们在 Objective-C 中的工作方式完全相同。

标签: iphone memory-management linked-list


【解决方案1】:

一位智者曾经说过:“我宁愿骑马,顺着它的方向走。”

当你可以使用一个非常好的NSMutableArray 类时,不要滚动你自己的结构。数组的线性迭代既便宜又容易,而且这个类有自己的内存管理钩子,你所要做的就是使用它们。

这是我在 C 和 C++ 开发人员中经常看到的,他们使用 Objective-C。我的下一个项目是取消一个非常资深的 C++ 人员在过去六个月中花费的项目。查看代码,很明显他几乎把所有时间都花在与框架争论上。在这一点上,他实际上已经构建了自己的自己的框架。

【讨论】:

    【解决方案2】:

    您是在NULLnil 旁边显式初始化吗?

    如果不是,它可能已经设置为某个非零值,因此while (pointTrain) 仍将评估为真。

    【讨论】:

    • 我只是在写相同答案的冗长版本; malloc 不保证返回的任何内存的内容。正是出于这个原因,很多人使用 calloc 或对 bzero 的额外调用作为其标准模式的一部分。除此之外,iPhone 上提供的 Objective-C 运行时是 C 的严格超集,所有正常的 C 规则都适用,所以 iPhone 部分的问题应该不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2011-05-04
    • 2021-07-07
    • 2020-02-01
    相关资源
    最近更新 更多