gpt4 book ai didi

CFDataCreateWithBytesNoCopy() 不能与 "const char var[xx]"一起使用,但可以与 malloc 一起使用吗?

转载 作者:行者123 更新时间:2023-11-30 14:21:19 26 4
gpt4 key购买 nike

只是真正寻找以下内容的解释,如果变量 digest 未手动分配,则 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;
}

顶层代码是否存在内存泄漏?

最佳答案

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

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

请注意,文档还指出,当 CFData 对象被释放时,外部缓冲区也被释放。

关于CFDataCreateWithBytesNoCopy() 不能与 "const char var[xx]"一起使用,但可以与 malloc 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14798618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com