我对这段代码如何导致分段错误感到十分困惑。代码在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);
}
答案 0 :(得分:1)
您的某个变量可能无效(或指向无效/超出范围/空数据)。
最好的方法是在启用调试的情况下进行编译。 启用要生成的核心转储(查看ulimit -c)
当您的应用程序访问SEGV时,将生成核心文件。 首先将其重命名为有用的东西(因此不会被覆盖)。 然后用gdb打开它。
从那里你可以检查变量,看看它应该是什么。 当使用gdb打开核心时,您还应该能够查看源代码。
我对OSX不太熟悉,但我假设你有gdb / dbx或同等版本。
答案 1 :(得分:0)
我将分段错误追踪到这一行:
mCurrentArray = CFArrayCreateMutableCopy(kCFAllocatorDefault, array_capacity, newArray);
问题是array_capacity对于要复制的数组不正确(太小)。为什么这会在程序的稍后阶段出错,我不确定。棘手的追踪并且只引起了10.4的问题。