gpt4 book ai didi

swift - 手动构建 Swift UnsafeMutablePointer 时,是否必须在 alloc 之后进行 destroy/dealloc?

转载 作者:IT王子 更新时间:2023-10-29 05:40:50 24 4
gpt4 key购买 nike

假设我在 Swift 中手动构造一个 C 数组并传递它,如下所示:

override func drawRect(rect: CGRect) {
let c = UIGraphicsGetCurrentContext()
var arr = UnsafeMutablePointer<CGPoint>.alloc(4)
arr[0] = CGPoint(x:0,y:0)
arr[1] = CGPoint(x:50,y:50)
arr[2] = CGPoint(x:50,y:50)
arr[3] = CGPoint(x:0,y:100)
CGContextStrokeLineSegments(c, arr, 4)
}

(我知道我必须这样做,但请耐心等待。)如果我不调用destroy 和/或dealloc 在这个 UnsafeMutablePointer 上,我是否泄漏了四个 CGPoint 的内存?

最佳答案

UnsafeMutablePointer 的文档非常清楚:

///                      This type provides no automated
/// memory management, and therefore the user must take care to allocate
/// and free memory appropriately.

所以如果你分配但不释放,你会泄漏内存。销毁指针对象时不会自动释放内存。

关于是否应该在释放之前销毁,也很清楚:

/// The pointer can be in one of the following states:
///
/// - memory is not allocated (for example, pointer is null, or memory has
/// been deallocated previously);
///
/// - memory is allocated, but value has not been initialized;
///
/// - memory is allocated and value is initialized.

但请记住,您可以在这些状态之间来回转换。因此在分配然后初始化然后取消初始化(又名销毁)对象之后,内存不再处于“已初始化”状态,因此您可以重新初始化或取消分配它。您还可以分配,然后取消分配,而无需初始化。

并且在调用 dealloc 时:

/// Deallocate `num` objects.
...
/// Precondition: the memory is not initialized.
///
/// Postcondition: the memory has been deallocated.

因此,在调用 dealloc 之前,您必须对任何已初始化的对象调用 destroy。你可能是对的,因为像 CGPoint 这样的东西是完全惰性的(只是两个 float 的结构)它可能不调用 不会造成任何伤害>destroy 在调用 dealloc 之前,但是如果不知道实现(可能是指针结构和编译器,因为标准库是语言可能会有一些内置的优化),一般来说,养成这不是一个好习惯。迟早你会忘记销毁一个 String,然后你会后悔的。

(顺便说一句,这些都没有说明 move 操作,它结合了初始化新内存和销毁旧内存)

如果您希望通过 UnsafePointer 进行某种自动的内存 self 清理,我认为这是不可能的,因为 a) 它是一个结构,所以不能实现 deinit 在超出范围时自动解除分配,并且 b) 它不跟踪它自己的大小——你必须跟踪你分配了多少,并在对 的调用中显式返回释放

标准库中有一些东西可以自动释放内存,而无需您自己动手 - HeapBufferStorage,这是标准库中唯一的一个类。大概它是一个专门受益于 deinit 实现的类。还有 HeapBuffer 来管理它,它有一个方便的 isUn​​iquelyReferenced() 函数,可以让你判断它是否被复制(即使它是一个结构)等允许您实现类似于数组和字符串的写时复制功能。

关于swift - 手动构建 Swift UnsafeMutablePointer 时,是否必须在 alloc 之后进行 destroy/dealloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27768290/

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