从目标 C++ (.mm) 调用 swift 静态函数时由于堆损坏而崩溃

Crash due to Heap corruption when calling swift static function from Objective C++ (.mm)

提问人:ImShrey 提问时间:3/8/2022 更新时间:3/8/2022 访问量:230

问:

我正在开发跨平台图形库,该库适用于 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,但它显示其他地方崩溃。

C++ Swift Objective-C 内存管理 金属

评论

0赞 Spo1ler 3/9/2022
这还不足以诊断此问题。
0赞 Spo1ler 3/9/2022
为了直截了当地说,您正在使用 Swift 桥接在 C++ 中包装 Swift Metal 调用?为什么不直接使用 Objective-C 或 Metal-cpp developer.apple.com/metal/cpp@objc
0赞 ImShrey 3/9/2022
因为最终我的目标是使它模块化,以便我们可以在任何可能或可能在 C++/跨平台/跨平台的新库中重用所有 swift 类。此外,更易于维护。

答: 暂无答案