Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ secverifytransform是否创建内存泄漏?_C++_Macos_Memory Leaks - Fatal编程技术网

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字节的泄漏。当该行被注释掉时,内存使用情况保持不变。您需要警惕操作系统报告的内存使用情况。内存分配器通常会保留释放的内存以供最终重用,因此该指标的增加并不一定意味着泄漏。这就是说,如果探查器报告泄漏,那么它确实令人担忧。