CFDataCreateWithBytesNoCopy()不能使用“const char var [xx]”但是会使用malloc吗?

时间:2013-02-10 14:13:46

标签: c pointers malloc core-foundation

只是真正寻找下面的解释,如果没有手动分配变量摘要,那么 CFDataCreateWithBytesNoCopy()返回的数据会在整个程序中被引用时不断变化

CFDataRef sha1(CFStringRef string)
{
    unsigned char* digest = malloc(CC_SHA1_DIGEST_LENGTH);

    const char* cData  = CFStringGetCStringPtr(string, CFStringGetFastestEncoding(string));
    CC_SHA1(cData, strlen(cData), digest);
    CFDataRef sha = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, digest, CC_SHA1_DIGEST_LENGTH, kCFAllocatorDefault);
    free(digest);
    CFRelease(string);
    return sha;
}

这不会起作用......

CFDataRef sha1(CFStringRef string)
{
    unsigned char digest[CC_SHA1_DIGEST_LENGTH];

    const char* cData  = CFStringGetCStringPtr(string, CFStringGetFastestEncoding(string));
    CC_SHA1(cData, strlen(cData), digest);
    CFDataRef sha = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, digest, CC_SHA1_DIGEST_LENGTH, kCFAllocatorDefault);
    return sha;
}

顶级代码中是否还有内存泄漏?

1 个答案:

答案 0 :(得分:2)

CFDataCreateWithBytesNoCopy的第二个参数是一个“指向字节缓冲区的指针,用作CFData对象的后备存储”,在讨论部分,你会发现 “创建的对象不会将外部缓冲区复制到内部存储区,而是将缓冲区用作其后备存储区”

现在,您的代码unsigned char digest[CC_SHA1_DIGEST_LENGTH];是一个具有自动存储持续时间的数组,这意味着一旦执行离开定义它的范围,它就会被释放。

请注意,文档还指出,当取消分配CFData对象时,外部缓冲区将被解除分配