分配手动分配的UnsafeMutablePointer <String>

时间:2019-12-15 23:14:16

标签: swift memory-management unsafe-pointers

我想将指针的指针值分配给手动分配的String。 换句话说,我想写这样的东西:

let pointer = UnsafeMutablePointer<String>.allocate(1)
pointer.pointee = "Hello, World!"

// ...

pointer.deallocate()

不幸的是,这段代码有时有时在第二行(即分配)崩溃。

如果指针的类型是数组,则可以观察到相同的行为。 但是,如果指针的类型不包含动态分配的存储空间(例如简单的Int),则该程序似乎永远不会失败。 这表明仅当指针的类型包装指向堆的指针(例如StringArray)时,才会出现此问题。

是否有解决此问题的方法?

我试图实现这一目标的原因是创建一个通用的内存竞技场。

1 个答案:

答案 0 :(得分:0)

来自official documentation

  

刚刚通过类型化指针分配的内存或已取消初始化的内存处于未初始化状态。   未初始化的内存必须先进行初始化,然后才能进行读取。

这说明了为什么代码不起作用。 指向者的内存已分配,但尚未初始化。 尽管这与简单的值类型(例如Int)无关,但对于像StringArray这样的更复杂的类型而言,却并非如此。 这些可能包含指向Swift的运行时在后台管理的堆内存的指针。 因此,如果没有适当的初始化,则运行时尝试对这些隐藏的指针执行操作时可能会崩溃。

在此特定示例中,问题在于运行时试图在分配新值之前释放先前分配给pointee的内存(即,包含字符串字符的基础堆存储),但由于从未分配过此内存而崩溃

该程序应进行以下纠正:

let pointer = UnsafeMutablePointer<String>.allocate(1)
pointer.initialize(to: "Hello, World!")

// ...

pointer.deallocate()