0
我縮小了內存泄漏到下面的代碼CFString字符串存儲器泄漏
CFStringRef CFDataToString(CFDataRef data)
{
UInt8* buf = malloc(CFDataGetLength(data));
CFDataGetBytes(data, CFRangeMake(0, CFDataGetLength(data)), buf);
CFMutableStringRef output = CFStringCreateMutable(kCFAllocatorDefault, CFDataGetLength(data) * 2);
for(int i = 0; i < CFDataGetLength(data); i++) {
CFStringAppendFormat(output, NULL, CFSTR("%02x"), buf[i]);
}
free(buf);
CFRelease(data);
return output;
}
下面是在上下文中使用的代碼,一些方法已被簡化爲示範。 儀器正在報告內存泄漏CFStringCreateMutable和CFStringAppendFormat。
CFStringRef CFDataToString(CFDataRef data)
{
UInt8* buf = malloc(CFDataGetLength(data));
CFDataGetBytes(data, CFRangeMake(0, CFDataGetLength(data)), buf);
CFMutableStringRef output = CFStringCreateMutable(kCFAllocatorDefault, CFDataGetLength(data) * 2);
for(int i = 0; i < CFDataGetLength(data); i++) {
CFStringAppendFormat(output, NULL, CFSTR("%02x"), buf[i]);
}
free(buf);
CFRelease(data);
return output;
}
CFDataRef hmac(CFStringRef key, CFStringRef data)
{
const char *cKey = CFStringGetCStringPtr(key, CFStringGetSystemEncoding());
const char *cData = CFStringGetCStringPtr(data, CFStringGetSystemEncoding());
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
CFDataRef HMAC = CFDataCreate(kCFAllocatorDefault, cHMAC, sizeof(cHMAC));
return HMAC;
}
CFDictionaryRef buildRequest(CFMutableDictionaryRef params)
{
CFMutableStringRef signature = CFStringCreateMutable(NULL, 0);
CFStringAppend(signature, CFDataToString(hmac(CFSTR("mykey"), CFSTR("mydata"))));
CFDictionarySetValue(params, CFSTR("signature"), signature);
// ....
// ....
return params;
}
void request(CFMutableDictionaryRef params)
{
params = buildRequest(params);
// ... Run request
CFRelease(params);
}
儀器輸出...
你究竟在哪裏發佈分配的數據?我相信回想一下,CFStringCreate ...創建了一些字符串,一旦你完成了這些字符串,就必須由'CFRelease'發佈。 CFDataToString'消失'在'CFStringAppend'而不被釋放。將指針保存在某個地方,並在您追加它後釋放它。 – 2013-02-19 21:01:00
這就是問題所在,創建一個指向由CFDataToString返回的CFStringRef的指針,然後一旦追加到簽名CFStringRef就釋放解決內存泄漏。我以爲'CFStringAppend'發佈了傳遞給它的字符串。 – 2013-02-19 21:16:31
也許看看這個[CFString字符串內存泄漏] [1] [1]:http://stackoverflow.com/a/14968063/3458862 – FlavienSi 2014-03-25 17:07:45