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の 2 番目のパラメーターは、「CFData オブジェクトのバッキング ストアとして使用されるバイト バッファーへのポインター」であり、ディスカッション セクションでは、「作成されたオブジェクトは外部バッファーを内部ストレージにコピーせず、代わりにバッキング ストアとしてのバッファ" .

これで、コードunsigned char digest[CC_SHA1_DIGEST_LENGTH];には自動保存期間を持つ配列が含まれるようになりました。これは、実行が定義されているスコープを離れると割り当てが解除されることを意味します。

ドキュメントには、CFData オブジェクトの割り当てが解除されると、外部バッファーの割り当ても解除されると記載されていることに注意してください。

于 2013-02-10T14:29:58.503 に答える