c - 真正的泄漏还是错误的分析仪报告?

标签 c core-foundation clang-static-analyzer

我的代码如下所示:

CFDictionaryRef myFunction()
{
    CFIndex myNumberIndex = 1234;
    CFNumberRef myNumber = NULL;
    CFMutableDictionaryRef theDict =  CFDictionaryCreateMutable(kCFAllocatorDefault, 0, 0, 0);

    myNumber = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &myNumberIndex);
    CFDictionaryAddValue(theDict, kSomeKeyConstant, myNumber);

    return theDict;
}

clang 静态分析器报告 myNumber 是一个泄漏的对象。显然,由于没有调用 CFRelease() 我倾向于理解这个问题,但我一般对 CF 不太熟悉,所以我想验证:myNumber 是否code> 需要在此处发布,即使它已添加到返回的 CFDictionary 中?也就是说......我要向字典添加一个具有自己的保留/释放需求的副本(在这种情况下我确实需要在这里释放它)?我认为答案与创建字典时使用的 kCFAllocatorDefault 参数有关,但我没有看到对象所有权的明确指示。

最佳答案

does myNumber need to be released here even though it's added to a CFDictionary that gets returned?

是的,您需要释放它。如果字典想要保留该对象,它会的——字典用它做什么不是你的问题。但是您创建了该对象,因此您需要释放它。

从调用 myFunction() 的函数的角度来看问题可能会有所帮助。 myFunction() 返回一个 CFDictionary。当调用者不再需要字典时,是否应该释放该字典中的每个对象?当然不是。但是如果调用者不这样做,并且如果您不释放 myNumber,则该对象将永远不会被释放,对吧?这就是泄漏。

请参阅Core Foundation memory management rules以获得进一步的解释。其中一个示例有几乎相同的情况,并显示了按要求执行的发布:

float myFloat = 10.523987;
CFNumberRef myNumber = CFNumberCreate(kCFAllocatorDefault,
                                    kCFNumberFloatType, &myFloat);
CFMutableArrayRef myArray = CFArrayCreateMutable(kCFAllocatorDefault, 2, &kCFTypeArrayCallBacks);
CFArrayAppendValue(myArray, myNumber);
CFRelease(myNumber);

关于c - 真正的泄漏还是错误的分析仪报告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22717046/

相关文章:

c - 为什么这个左移操作的结果会被认为是未定义的?

c - 在C-pset5 cs50中加载trie数据结构

c - print_once,它是如何按 block 工作的?

CFStringCreateWithCString 对于少于 10 个字符的字符串返回 null

c++ - clang 静态分析器跳过一些检查

c++ - C++ 如何处理 try catch block 中的赋值?

c - 写一个十六进制字符串的问题

c++ - C/C++ 控制结构限制?

cocoa - CGEventTapCreate 神秘崩溃并出现 "key down"事件

ios - swift 5.1 : How can I pass NULL as an argument?