2013-02-10 60 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對象被釋放

相關問題