因此,我的问题是:“标题”以及SystemVerilog中动态数组的垃圾收集规则是什么?
上下文:
在我的程序中,我发现了一个bug,您可以在函数中实例化动态数组(本地)并在该函数中向该数组添加元素,但是如果不删除该数组,则条目将保留在那里(即内存和引用被保留)。因此,当您再次调用该函数时,可以访问以前输入的所有条目。解决方案是在退出函数之前简单地删除动态数组。我假设数组没有被删除,因为数组是在堆上实例化的,而不是堆栈,编译器不知道什么时候垃圾收集它,因为它可能是一个返回的引用(如果我错了,请纠正我--我不熟悉动态数组的垃圾收集规则)。
但是,如果动态数组在类内实例化(作为成员变量),会发生什么?您如何知道动态数组是否被删除(即引用和内存被删除)?这种情况下的垃圾收集规则是什么?
我有示例代码来演示这个问题,如果它有帮助的话,但我不认为有必要包含它(如果您想要一个示例,请告诉我)。同样的情况也发生在关联数组中(因为我认为它是SystemVerilog中的一种动态数组类型)。
谢谢!
发布于 2020-07-24 06:27:46
SystemVerilog有三种不同的可变寿命:
fork/join_none
)只能从声明它的作用域中引用。动态大小的数组有一个生命周期的复合概念。单个元素具有动态生存期,但是数组作为一个整体可以具有上述任何一个生命周期。就您的问题而言,我认为我们可以将数组看作一个集合。这意味着,每当数组变量的生存期结束时,所有动态分配的元素都会被回收。
类对象具有动态生存期,但是保存句柄引用类对象的类变量可以满足上述任何一个生命周期。但是,由于多个类变量可以引用同一个类对象,所以当没有更多的类变量引用该对象时,类对象的生存期就结束了。因此,如果该类对象包含动态数组变量,则这些变量的生存期将在对象生存期结束时结束。
SystemVerilog没有指定垃圾收集是如何工作的。当某物的生命周期结束时,您将无法再访问它。没有办法知道什么时候才能真正回收内存。
您的问题似乎在函数中有一个静态声明的动态数组,或者一个静态函数参数。在Verilog中,默认情况下,所有非类函数都具有静态生存期。类方法只能具有自动生存期。如果这个解释没有回答你的问题,你需要发布一些代码。
顺便说一句,这成了我DVCon 2021论文及介绍的主题
https://stackoverflow.com/questions/63064368
复制相似问题