只是真正寻找下面的解释,如果没有手动分配变量摘要,那么 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;
}
顶级代码中是否还有内存泄漏?
答案 0 :(得分:2)
CFDataCreateWithBytesNoCopy的第二个参数是一个“指向字节缓冲区的指针,用作CFData对象的后备存储”,在讨论部分,你会发现 “创建的对象不会将外部缓冲区复制到内部存储区,而是将缓冲区用作其后备存储区”。
现在,您的代码unsigned char digest[CC_SHA1_DIGEST_LENGTH];
是一个具有自动存储持续时间的数组,这意味着一旦执行离开定义它的范围,它就会被释放。
请注意,文档还指出,当取消分配CFData对象时,外部缓冲区将被解除分配。