C++ secverifytransform是否创建内存泄漏?
以以下代码为例:C++ secverifytransform是否创建内存泄漏?,c++,macos,memory-leaks,C++,Macos,Memory Leaks,以以下代码为例: // init CFDataRef signature = CFDataCreate(...); CFDataRef pubKeyData = CFDataCreate(...); CFArrayRef array = NULL; OSStatus res = SecItemImport(pubKeyData, ..., &array); SecKeyRef pubKey = (SecKeyRef) CFArrayGetValueAtIndex(array, 0);
// 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的检测工具中可以观察到320B泄漏(每次调用)
我假设SecVerifyTransformCreate方法分配了一些内存,并希望您调用secttransformexecute,然后释放它。如果你不这样做,就会有漏洞。我认为这是错误的行为
正如Frank提到的,操作系统报告的内存使用量即使在没有明显泄漏的情况下也会增长,但不会呈指数增长(在我的例子中,它停止在40MB左右)。这是正确的行为
感谢弗兰克的精雕细琢。您是如何确定内存泄漏的?仅仅是应用程序的内存使用量增加了,还是您通过检测来收集这些信息?应用程序的内存使用量增加了。我已经在循环中运行了这段代码以进行测试。我还检查了Xcode的探查器(更具体地说是泄漏),它显示每次迭代确实有320字节的泄漏。当该行被注释掉时,内存使用情况保持不变。您需要警惕操作系统报告的内存使用情况。内存分配器通常会保留释放的内存以供最终重用,因此该指标的增加并不一定意味着泄漏。这就是说,如果探查器报告泄漏,那么它确实令人担忧。