使用CFNumberGetValue进行分段错误

时间:2011-07-26 20:32:08

标签: macos core-foundation

我对这段代码如何导致分段错误感到十分困惑。代码在10.5+上工作正常,但10.4上的seg故障。有任何想法吗?在CFNumberGetValue期间发生故障。

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);
}

2 个答案:

答案 0 :(得分:1)

  • CFNumberGetValue(volume_num,kCFNumberFloatType,& volume)

您的某个变量可能无效(或指向无效/超出范围/空数据)。

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

当您的应用程序访问SEGV时,将生成核心文件。 首先将其重命名为有用的东西(因此不会被覆盖)。 然后用gdb打开它。

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

我对OSX不太熟悉,但我假设你有gdb / dbx或同等版本。

答案 1 :(得分:0)

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

mCurrentArray = CFArrayCreateMutableCopy(kCFAllocatorDefault, array_capacity, newArray);

问题是array_capacity对于要复制的数组不正确(太小)。为什么这会在程序的稍后阶段出错,我不确定。棘手的追踪并且只引起了10.4的问题。

相关问题