提问人:ImShrey 提问时间:3/8/2022 更新时间:3/8/2022 访问量:230
从目标 C++ (.mm) 调用 swift 静态函数时由于堆损坏而崩溃
Crash due to Heap corruption when calling swift static function from Objective C++ (.mm)
问:
我正在开发跨平台图形库,该库适用于 iOS,使用 Metal API。 该库的核心是 C++,然后我正在 Objective C++ (.mm) 代码中实现一些派生类。
从我的派生类中,我调用了一个快速的静态函数,该函数向我返回一些对象。
它最初有效,几天后我突然出现以下错误。
// MetalLibrary.mm
void FooLibrary::CreateNewLibrary(const std::string &source) {
this.library = [SwiftHelper_MetalLibrary createNewLibraryWithSource: [NSString stringWithUTF8String: source.c_str()]];
}
我创建了一个映射器标头,它将在编译时为 swift 等效类定义 ObjC 接口 ref: 如何在同一框架内访问 Objective-C 中的内部 Swift 类
// Mapper.h
SWIFT_CLASS("SwiftHelper_MetalLibrary_OBJC")
@interface SwiftHelper_MetalLibrary : NSObject
+ (id<MTLLibrary> _Nonnull) createNewLibraryWithSource: (NSString* _Nonnull) source;
@end
}
Swift 等效帮助程序类
// SwiftHelper_MetalLibrary.swift
@objc(SwiftHelper_MetalLibrary_OBJC)
internal class SwiftHelper_MetalLibrary: NSObject {
@objc internal class func createNewLibraryWithSource(_ source: String) -> MTLLibrary {
// Some custom logic
// CRASHES HERE with ERROR:
// "heap corruption detected, free list is damaged at <ADDRESS>"
}
}
这里没有特别的逻辑,我只是从 gpu 实例创建一个库(我作为参数获得,例如未显示)MTLDevice 实例不是 nil。所以这在我的任何 Swift 方法中都是随机发生的。
知道可能是什么原因吗?尝试了Address Sanitizer,但它显示其他地方崩溃。
答: 暂无答案
评论
@objc