【问题标题】:Swift: 'Abort trap: 6 - pointer being freed was not allocated' with class where clause斯威夫特:'中止陷阱:6 - 被释放的指针未分配'与类where子句
【发布时间】:2015-12-02 19:54:33
【问题描述】:

考虑以下几点:

protocol DataContainer {
  typealias Data
}

protocol Foo {
  typealias FooBar: DataContainer
  typealias FooBaz: DataContainer
  typealias Schema
}

final class FooClass<F: Foo where F.Schema == F.FooBar.Data, F.Schema == F.FooBaz.Data> {}

这个相当富有表现力的 where 子句无法编译并带有神秘的错误消息:

由于信号导致命令失败:中止陷阱 6
...
swift(4946,0x7fff777c9300) malloc: *** 对象 0x7fff5a5fbfe0 错误:未分配指针被释放

对我来说,这完全没有意义。我已经确认,当我像这样删除 where 子句约束时,错误消失了:

final class FooClass<F: Foo> {}

我知道这是在黑暗中的远景,但有人经历过吗?

如果是这样,您找到了什么解决方法?


附录:如果 swift 允许在protocol 本身内部 表达等式约束,而不是将约束泄漏到其实现者中,则可以完全避免这种情况。参考this question。

【问题讨论】:

  • 那个“神秘的错误信息”在我看来更像是 Swift 编译器崩溃。如果是这样,您应该创建一个最小的示例,并在 bugreport.apple.com 上向 Apple 报告。对于它的价值,我得到了一个不同的错误'Data' is not a member type of 'F.FooBar',这更有意义。 (Xcode 7.1.1)
  • @JeremyP 我知道这是编译器崩溃。仅凭它的信息就很明显,没有指出。我所说的 cryptic 的意思是它与手头的代码无关。而且我已经报了。谢谢。
  • 从您的问题文本中,您意识到自己手上的编译器崩溃并不明显。顺便说一句,我并没有批评你的问题或建议你不应该因此而问这个问题,我只是想确保苹果公司意识到这个问题,以便可以修复它。不管你的代码有没有错,如果它使编译器崩溃,那就是编译器的一个错误。
  • @JeremyP 对于反应过度我深表歉意。最近我对 swift 的编译器问题很少感到沮丧。希望你有一个美好的一天!
  • 自从第一个测试版发布以来,我一直在使用 Swift,所以我完全理解您的沮丧。仍然有太多编译器崩溃,通常需要一段时间才能找到导致它们的行。

标签: swift swift2


【解决方案1】:

好的。所以经过几次蛮力调试后,我发现如果我对受约束的参数使用相同的 type 名称,它确实可以编译。

例如,

protocol Foo {
  typealias FooBar
  typealias FooBaz
  typealias Data
}
final class FooClass<F: Foo where F.Data == F.FooBar.Data, F.Data == F.FooBaz.Data> {}

这将编译。请注意,我所做的只是将Schema 更改为Data。这绝对是一个错误。

-EDIT:并据此报告。

【讨论】:

    猜你喜欢
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多