只需从文档中复制:
pointer_from_objref(object_instance):
生成的Ptr的存在不会保护对象不被垃圾收集,因此您必须确保在Ptr将被使用的整个时间内对象保持引用.
参考文献{T}:
安全引用类型T数据的对象.此类型保证指向正确类型的有效Julia分配内存.只要引用了Ref本身,就可以保护底层数据不被垃圾收集器释放.
当作为ccall参数传递时(作为Ptr或Ref类型),Ref对象将转换为指向它引用的数据的本机指针.
没有无效(NULL)参考.
我想传递一个指向ac函数的指针.根据文档,似乎使用pointer_from_objref并不总是安全的,所以我尝试使用Ref:
# test 1
bufferID = convert(GLuint, 0)
glGenBuffers(1, pointer_from_objref(bufferID))
@show bufferID
out => bufferID = 0x00000001 # ok
# test 2
bufferID = convert(GLuint, 0)
glGenBuffers(1, Ref(bufferID))
@show bufferID
out => bufferID = 0x00000000 # unexpected result
# test 3
bufferID = GLuint[0]
glGenBuffers(1, Ref(bufferID))
@show bufferID[]
out => bufferID[] = 0x00000001 # ok
Run Code Online (Sandbox Code Playgroud)
结果显示,test 2没有任何错误会产生意外结果,但test 3在转换bufferID为数组时工作正常.
我的问题是为什么test 2会在没有发生错误的情况下给出意外结果.为安全起见,总是使用Ref()而不是pointer_from_objref()?如果是,是否有任何副作用(例如表现)?
我正在使用julia v"0.4.0-rc1".
小智 1
要遵循该模式,请尝试以下操作,这对我在其他 ccall() 代码上有效。我认为 Ref{T} 是内存分配的重要组成部分,并通过 var[] 取消引用。
# test 4
bufferID = Ref{GLuint}(0)
glGenBuffers(1, bufferID)
@show bufferID[]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |