这会导致Go内存泄漏吗?

时间:2015-09-03 15:04:06

标签: memory-leaks go slice

在下面的代码中,我有两个结构类型:ObjectDefinitionfieldDefinition都在同一个包中。 fieldDefinition结构只应通过ObjectDefinition上的方法创建,以防止孤立的字段(相关系统将是可扩展的CRM)。

AddReferenceField方法应创建一个新的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 fields
with the given parameters and returns a pointer to it. This function will return
a 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 ObjectDefinition
newId := id.Generate()
newField, newFieldErr := od.AddReferenceField("example", "Example", newId, false, DC_SETNULL)

newField.SetSomethingElse(true)

所以现在newField是指向fieldDefinition的指针,但同一指针已被添加到od上的切片中。这里是否存在内存泄漏的可能性?

1 个答案:

答案 0 :(得分:1)

Go是garbage collected language。回应评论中的人们所说的,这不会导致内存泄漏。虽然 0 1 2 3 4 key val0 val1 val2 val3 val4 key val0 val1 val2 val3 val4 key val0 val1 val2 val3 val4 key val0 val1 val2 val3 val4 保存指向新创建的od的指针,但fieldDefinition将保留在堆中。当fieldDefinition超出范围并被销毁时,它指向的所有od也将有资格进行垃圾收集,前提是没有任何实时操作指向它们。