首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CFString内存泄漏

CFString内存泄漏
EN

Stack Overflow用户
提问于 2013-02-19 20:58:01
回答 1查看 2.7K关注 0票数 2

我已经将内存泄漏缩小到以下代码

代码语言:javascript
复制
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.的内存泄漏

代码语言:javascript
复制
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);
}

仪器输出..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-19 21:44:58

再回答一次。

使用Create方法分配的所有数据都负责将数据发布给程序员。在这方面,这与调用malloc是一样的。任何方法都不会发布这些数据,除非在文档中有明确的说明。

要解决您的问题,请在接收该数据的方法中保存对“已创建”(已分配)数据的引用,并在方法结束时释放它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14967275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档