采用以下代码:
// init
CFDataRef signature = CFDataCreate(...);
CFDataRef pubKeyData = CFDataCreate(...);
CFArrayRef array = NULL;
OSStatus res = SecItemImport(pubKeyData, ..., &array);
SecKeyRef pubKey = (SecKeyRef) CFArrayGetValueAtIndex(array, 0);
// everything goes wrong here
SecTransformRef verifier = SecVerifyTransformCreate(pubKey, signature, NULL);
// release
CFRelease(signature);
CFRelease(pubKeyData);
CFRelease(signature);
CFRelease(verifier);
简而言之:我正在从文件中导入公钥和签名,为该签名创建验证器。在后续代码行中,我能够成功验证签名。
我担心的是调用SecVerifyTransformCreate 方法时发生的内存泄漏。如果我注释掉该行,泄漏就消失了。
我已经阅读了所有关于创建规则和获取规则的内容,我想我已经弄清楚了发布。
最佳答案
经过一些广泛的测试,这是我发现的:
如问题所述,在上面代码之后的行中,我正在执行验证器来检查签名是否正确,重要的方法是:
CFTypeRef result = SecTransformExecute(verifier, NULL);
如果我不包括这行代码,则在 Xcode 的Instrumentation 工具中可以观察到 320B 的泄漏(每次调用)。
我假设 SecVerifyTransformCreate 方法分配了一些内存,并希望您调用 SecTransformExecute,然后释放它。如果你不这样做,就会有泄漏。 IMO 这是错误的行为。
正如 Frank 所提到的,即使没有明显的泄漏,操作系统报告的内存使用量也会增长,但不会呈指数增长(在我的例子中它停止在 40MB 左右)。这是正确的行为。
感谢 Frank 的详尽阐述。
关于c++ - SecVerifyTransformCreate 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41700807/