真正的泄漏或错误的分析报告?

时间:2014-03-28 15:30:09

标签: 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一般都不够精通,所以我想验证:{{1}需要在这里发布,即使它已被添加到返回的CFDictionary中?那就是......我正在为字典添加一个有自己的保留/释放需求的副本(在这种情况下我需要在这里发布它)?我假设答案与创建字典时使用的myNumber参数有关,但我没有看到对象所有权的明确指示。

1 个答案:

答案 0 :(得分:3)

  

myNumber是否需要在此处发布,即使它被添加到返回的CFDictionary中?

是的,你需要发布它。如果字典想要保留该对象,它将 - 字典对它的作用不是你的问题。但是你创建了这个对象,所以你需要释放它。

从调用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);