c++ - SecVerifyTransformCreate 内存泄漏?

标签 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);

// 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/

相关文章:

c++ - 为什么 temp->next!=NULL 有效而 temp!=NULL 在 C++ 的链表中不起作用

ruby - 无法通过 rvm bundle install 安装 ffi 1.9.0 - OSX 10.8.4

c++ - 后修复计算器,返回错误值

c++ - 链接 : fatal error LNK1104: cannot open file 'ucrtd.lib' in VS2017 RC

c++ - 在编译器中禁用默认数字类型

objective-c - 如何制作一个出现在全屏窗口顶部的 Cocoa 窗口?

python - Gevent 处于不受支持或无效的轮子中

c++ - 映射/集合中插入(新类对象)的内存泄漏

java - JDO PersistenceManager 内存泄漏

java - jittable 的大小增加是否与 android 上的内存泄漏相关?