- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
假设我在 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
来管理它,它有一个方便的 isUniquelyReferenced()
函数,可以让你判断它是否被复制(即使它是一个结构)等允许您实现类似于数组和字符串的写时复制功能。
关于swift - 手动构建 Swift UnsafeMutablePointer 时,是否必须在 alloc 之后进行 destroy/dealloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27768290/
我有两个类(class): parent 和 child child : belongs_to :parent 和 家长 has_many :children, :dependent => :dest
我有这个模型 class XmlImport ["text/xml"] end :event_import_records 条目正在被销毁。但是 :events 不是。 has_many throu
我定义了以下简单的管道: image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' - 'PATH
我定义了以下简单的管道: image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' - 'PATH
在我们的应用程序中,我们覆盖了 ActiveRecord destroy 方法,以便我们的记录不会被删除(因此用户可以取消删除)。像这样: def destroy self.is_deleted
我有一个笔记模型,具有以下关联 注意.rb has_many :note_categories, :dependent => :destroy has_many :categories, :throu
我是一名 Python 初学者。尝试制作一个新按钮来关闭窗口。我收到错误消息: Exception in Tkinter callback Traceback (most recent call la
我在我的应用程序中添加了评论功能,到目前为止一切正常,直到出现此错误。我所做的是添加了删除评论功能。当我启动服务器时一切正常,但在我单击“删除”按钮后问题出现了。 错误信息 undefined loc
Rails,def destroy,没有响应 destroy.js.erb 这是我的方法: # DELETE /Groups/1 # DELETE /Groups/1.xml def de
假设我有一个 MyClass 对象的集合 MyCollection。 Set MyCollection = Nothing 是否调用每个包含的对象的析构函数,或者我应该单独设置每个对象 = Nothi
我正在尝试使用 Node.js、Express 和 Mongodb 构建 REST API。我正在使用 mongodb npm 包连接到数据库,下面是我的 sever.js 文件代码 var expr
我有一个小问题,我有以下两个模型: class CriticalProcess :destroy has_many :roles, :through => :authorizations a
我正在使用 ng2-toastr 并收到以下错误 https://www.npmjs.com/package/ng2-toastr Attempt to use a destroyed view: d
基本信息: 系统: # cat /proc/version Linux version 3.10.0-514.2.2.el7.x86_64 (builder@kbuilder.dev.centos.o
一 点睛 destroy 用于销毁 ThreadGroup,该方法只是针对一个没有任何 active 线程的 group 进行一次 destroy 标记,调用该方法的直接结果是在父 group 中将自
我开始注意到 Scope::Guard 的一些奇怪之处。 . 如果我取消定义 $guard变量作为 sub 中的最后一个语句,守卫的 sub 得到 比我预期的要晚打电话。 如果我不取消它,或者如果我做
我正在构建一个提供打开和关闭它的服务的模式。该模式有一个控制关闭按钮的小 Controller ,以及进入模式内容的模板的 $compile。 那个模板就是一个组件,当然,那个组件有一个 Contro
一直在文件馆和网上寻找答案,但没有真正找到答案,只是零零碎碎。似乎有很多建议的帖子,但没有一个有答案。 我有一个使用范围的复杂指令:true。它实际上是我正在尝试为其编写清理代码的 ng-grid 最
给定以下 Delphi 代码,Foo 在 FormClose 上是 Free,但 TFoo.Destroy 是没有被调用 - 因此 Bar 没有被 Free'd,导致内存泄漏? 我是否在这里错过了一些
https://docs.angularjs.org/guide/directive By listening to this event, you can remove event listener
我是一名优秀的程序员,十分优秀!