gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:16:35 26 4
gpt4 key购买 nike

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

AddReferenceField 方法应该创建一个新的 fieldDefintion,在其上设置一些变量,将其添加到父结构的 *fieldDefinition slice 中,然后然后还返回指向它的指针,以允许程序员轻松地进一步操作该字​​段,而无需从 slice 中查找和检索它。

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 上的 slice 。这里是否存在内存泄漏的可能性?

最佳答案

Go 是一个 garbage collected language .回应评论中的人所说的,这不会导致内存泄漏。当 od 持有指向新创建的 fieldDefinition 的指针时,fieldDefinition 将保留在堆中。当 od 超出范围并被销毁时,它指向的所有 fieldDefinition 也将有资格进行垃圾回收,前提是没有任何事件持有指向它们的指针。

关于memory-leaks - 这会导致 Go 中的内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32379248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com