我的代码如下所示:
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/