在下面的代码中,我有两种结构类型: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 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。这里是否存在内存泄漏的可能性?
森栏
相关分类