【发布时间】:2019-07-24 22:55:12
【问题描述】:
我对 GoLang 的垃圾收集器有点困惑。
考虑以下代码,我在其中为我的类型 T 实现阅读器接口。
type T struct {
header Header
data []*MyDataType
}
func (t *T) Read(p []byte) (int, error) {
t.Header = *(*Header) (t.readFileHeader(p))
t.Data = *(*[]*MyDataType) (t.readFileData(p))
}
在阅读器函数中,我将使用 unsafe.Pointer 将数据转换为 MyDataType,这将指向使用反射模块创建的切片(这更复杂,但对于示例而言,这应该足够了)
func (t *T) readFileData(data []byte, idx int, ...) unsafe.Pointer {
...
return unsafe.Pointer(&reflect.SliceHeader{Data : uintptr(unsafe.Pointer(&data[idx])), ...})
}
如果我要在不同的函数中读取数据
func (d *Dummy) foo() {
data, _ := ioutil.ReadFile(filename)
d.t.Read(data) <---will GC free data?
}
现在我很困惑,如果有可能,GC 会在退出 foo 函数后从文件中释放加载的数据。或者d.t被释放后数据会被释放。
【问题讨论】:
-
如果你有一个指向某个东西的指针,GC 不会释放它。您遇到问题了吗?
-
其次,GC 非常可靠,所以除非你真的遇到问题,否则这似乎是在调试假设,因此没有必要。
标签: go garbage-collection unsafe-pointers