Macos 具有CFNumberTargetValue的分段错误

Macos 具有CFNumberTargetValue的分段错误,macos,core-foundation,Macos,Core Foundation,我完全搞不懂这段代码是如何导致分段错误的。该代码在10.5+上运行良好,但在10.4上seg故障。有什么想法吗?故障发生在CFNumberTargetValue期间 CFNumberRef volume_num = (CFNumberRef)CFDictionaryGetValue(dict, CFSTR("Volume")); if(volume_num != NULL) { float volume = 1.f; CFNumberGetValue(volume_num, kC

我完全搞不懂这段代码是如何导致分段错误的。该代码在10.5+上运行良好,但在10.4上seg故障。有什么想法吗?故障发生在CFNumberTargetValue期间

CFNumberRef volume_num = (CFNumberRef)CFDictionaryGetValue(dict, CFSTR("Volume"));
if(volume_num != NULL) {
    float volume = 1.f;
    CFNumberGetValue(volume_num, kCFNumberFloatType, &volume);
};
编辑:上面的代码获取由下面的代码添加到字典中的值。mKitManager.GetKitVolume()返回默认值1.0

AddFloatToDictionary(dict, CFSTR("Volume"), mKitManager.GetKitVolume());

static void AddFloatToDictionary(CFMutableDictionaryRef dict, CFStringRef key, float value)
{
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberFloatType, &value);
    CFDictionarySetValue(dict, key, num);
    CFRelease(num);
}
  • cfNumberTargetValue(卷数、kCFNumberFloatType和卷)
您的一个变量可能无效(或指向无效/超出范围/空数据)

最好的方法是在启用调试的情况下编译。 启用要生成的核心转储(查看ulimit-c)

当应用程序点击SEGV时,将生成一个核心文件。 首先将其重命名为有用的名称(这样它就不会被覆盖)。 然后用gdb打开它

从那里你可以检查变量,看看哪些不是应该的。 当核心使用gdb打开时,您还应该能够查看源代码


我对OSX不太熟悉,但我假设您将使用gdb/dbx或同等产品。

我将分段错误追溯到这一行:

mCurrentArray = CFArrayCreateMutableCopy(kCFAllocatorDefault, array_capacity, newArray);

问题是要复制的阵列的阵列容量不正确(太小)。为什么这会在程序的后期出现seg故障,我不太清楚。很难找到,只在10.4上出现了问题。

您是否确认
volume_num
实际上是一个
CFNumberRef
,它的类型是
kCFNumberFloatType
?是的!在进行cfNumberTargetValue调用之前,将创建默认的CFNumberRef并将其添加到dict中。奇怪。你说的“默认CFNumberRef”是什么意思?一个充当默认值的CFNumberRef对象。在本例中,是一个值为1.0的kCFNumberFloatType类型。您能告诉我并在创建它的地方添加代码吗?