2013-02-19 64 views
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; 
}  

下面是在上下文中使用的代碼,一些方法已被簡化爲示範。 儀器正在報告內存泄漏CFStringCreateMutableCFStringAppendFormat

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

儀器輸出...

enter image description here

enter image description here

+1

你究竟在哪裏發佈分配的數據?我相信回想一下,CFStringCreate ...創建了一些字符串,一旦你完成了這些字符串,就必須由'CFRelease'發佈。 CFDataToString'消失'在'CFStringAppend'而不被釋放。將指針保存在某個地方,並在您追加它後釋放它。 – 2013-02-19 21:01:00

+0

這就是問題所在,創建一個指向由CFDataToString返回的CFStringRef的指針,然後一旦追加到簽名CFStringRef就釋放解決內存泄漏。我以爲'CFStringAppend'發佈了傳遞給它的字符串。 – 2013-02-19 21:16:31

+0

也許看看這個[CFString字符串內存泄漏] [1] [1]:http://stackoverflow.com/a/14968063/3458862 – FlavienSi 2014-03-25 17:07:45

回答

2

這一次,作爲答案。

所有使用Create方法分配的數據都將釋放數據的責任交給程序員。在這方面,它與調用malloc相同。除非在文檔中明確聲明,否則任何方法都不會公佈這些數據。

爲了解決您的問題,請在接收方法中保存對「創建」(分配)數據的引用,並在方法結束後將其釋放。