为了账号安全,请及时绑定邮箱和手机立即绑定

这会导致 Go 中的内存泄漏吗?

这会导致 Go 中的内存泄漏吗?

Go
慕桂英4014372 2021-11-01 17:36:38
在下面的代码中,我有两种结构类型:ObjectDefinition并且fieldDefinition都在同一个包中。fieldDefinition结构应该只通过一种方法创建ObjectDefinition以防止孤立字段(有问题的系统将是一个可扩展的 CRM)。该AddReferenceField方法应该创建一个 new fieldDefintion,在其上设置一些变量,将其添加到父结构的切片中*fieldDefinition,然后还返回指向它的指针,以允许程序员轻松地进一步操作该字段,而无需从切片中查找和检索它。type ObjectDefinition struct {    myId        id.ID    orgId       id.ID    apiName     string    label       string    pluralLabel string    description string    helpText    string    fields      map[id.ID]*fieldDefinition    newFields   []*fieldDefinition    systemFields}/*AddReferenceField adds a reference type field to the list of uncommitted fieldswith the given parameters and returns a pointer to it. This function will returna nil pointer and an error if any of the given parameters were invalid.*/func (o *ObjectDefinition) AddReferenceField(name, label string, refObj id.ID, reparentable bool, delCon deleteConstraint) (*fieldDefinition, error) {    //TODO - investigate this as a possible source of memory leakage. Creating a pointer, adding that pointer to a slice, then returning the same pointer.    nrf := new(fieldDefinition)    nrf.fieldType = FT_REFERENCE    if err := nrf.SetName(name); err != nil {        return nil, err    }    if err := nrf.SetLabel(label); err != nil {        return nil, err    }    if err := nrf.SetReferenceObjectId(refObj); err != nil {        return nil, err    }    if err := nrf.SetReparentable(reparentable); err != nil {        return nil, err    }    if err := nrf.SetDeleteConstraint(delCon); err != nil {        return nil, err    }    o.newFields = append(o.newFields, nrf)    return nrf, nil}我没有包含完整的fieldDefinition代码,因为它并不真正相关,而且非常庞大,但是从主程序循环中使用的一个例子是:var od ObjectDefinitionnewId := id.Generate()newField, newFieldErr := od.AddReferenceField("example", "Example", newId, false, DC_SETNULL)newField.SetSomethingElse(true)所以现在 newField 是一个指向 的指针fieldDefinition,但相同的指针已被添加到 上的切片中od。这里是否存在内存泄漏的可能性?
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

Go 是一种垃圾收集语言。回应评论中的人们所说的,这不会导致内存泄漏。虽然od持有指向新创建的指针fieldDefinitionfieldDefinition它将留在堆中。当od超出范围并被销毁时,fieldDefinition它指向的所有s 也将有资格进行垃圾收集,前提是没有任何活动持有指向它们的指针。


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信