0

只是真的在寻找以下的解释,如果变量摘要不是手动分配的,那么 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;
}

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

4

1 回答 1

2

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

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

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

于 2013-02-10T14:29:58.503 回答