2013-02-10 184 views
0

如果变量摘要没有手动分配,那么返回的数据在整个程序中被引用时会不断变化,并返回由CFDataCreateWithBytesNoCopy()连续变化的数据。CFDataCreateWithBytesNoCopy()不会与“const char var [xx]”一起工作,但会与malloc?

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

也有在上面代码中的任何内存泄漏?

回答

2

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

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

注意,文档还指出外部缓冲器被释放当CFData对象被释放

相关问题