gpt4 book ai didi

swift - 分配手动分配的 UnsafeMutablePointer

转载 作者:行者123 更新时间:2023-11-30 10:29:58 25 4
gpt4 key购买 nike

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

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

// ...

pointer.deallocate()

不幸的是,这段代码有时似乎在第二行(即赋值)处崩溃。

如果受指点的类型是数组,则可以观察到相同的行为。然而,如果被指针的类型不包含动态分配的存储(例如简单的 Int),这个程序似乎永远不会失败。这表明该问题仅在指针接收者的类型包装指向堆的指针时发生,例如 StringArray

有办法解决这个问题吗?

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

最佳答案

来自official documentation :

Memory that has just been allocated through a typed pointer or has been deinitialized is in an uninitialized state. Uninitialized memory must be initialized before it can be accessed for reading.

这解释了为什么代码不起作用。被指点者的内存已分配,但尚未初始化。虽然这与简单值类型(例如 Int)无关,但它不适用于诸如 StringArray 等更复杂的类型。它们可能包含指向 Swift 运行时在幕后管理的堆内存的指针。因此,如果没有正确的初始化,运行时在尝试对这些隐藏指针执行操作时可能会崩溃。

在这个特定的示例中,问题是运行时在分配新值之前尝试释放先前分配给指针对象的内存(即包含字符串字符的底层堆存储),但由于从未分配该内存而崩溃.

程序应更正如下:

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

// ...

pointer.deallocate()

关于swift - 分配手动分配的 UnsafeMutablePointer<String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59348906/

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