gpt4 book ai didi

swift - 如果用 "copy constructor"初始化,Data 的 `freeWhenDone:false` 是否复制其引用的字节?

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:15 25 4
gpt4 key购买 nike

如果我使用 bytesNoCopy:count:deallocator:.none 分配一个 Data 对象,它应该以不安全的方式引用给定的字节,我作为程序员 promise 字节将在数据的生命周期内可用,而不是数据自行控制。

没关系。我想知道的是......因为它是一个值类型而不是引用类型,当我从我的 nocopy-Data 分配另一个数据变量时会发生什么?它是否复制数据(违背我的明确意愿)?还是它会创建一个我必须跟踪其生命周期或崩溃风险的另一个不安全数据实例?

这是一个例子:

let unsafe = malloc(5);
func makeUnsafeData() -> Data
{
return Data(bytesNoCopy: unsafe, count: 5, deallocator: .none)
}

struct Foo
{
var d: Data
}

var foo = Foo(d: makeUnsafeData())
free(unsafe)

问题是:foo.d 是否包含指向曾经位于 unsafe 中的已释放字节的悬挂指针?或者它是否包含这些字节的自己的副本,并且可以安全使用?

This experiment gist似乎表明 NSData 在上述情况下崩溃,正如预期的那样,但 Data 没有;所以我的初步结论是 Data 复制数据,并且没有办法使用 Data 实例在函数之间传输字节而不复制字节。但我喜欢引用任何反驳或证实这一理论的文件。

最佳答案

原来,答案是in the documentation毕竟...只要您的所有 Data 实例都是 let 并且您永远不会对其进行变异,那么只有原始字节应该在内存中,所有 Datas 都只是引用它。

我可能只是使用 NSData 来代替,因为它是一个引用类型并且没有那么神奇......

Screenshot of documentation

关于swift - 如果用 "copy constructor"初始化,Data 的 `freeWhenDone:false` 是否复制其引用的字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55609318/

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