Arrays SystemVerilog:一旦类对象不再被引用,动态数组(类内)是否保证被垃圾收集?
所以我的问题是:“标题”和SystemVerilog中动态数组的垃圾收集规则是什么 上下文: 在我的程序中,我发现了一个bug,您可以在函数中实例化一个动态数组(本地),并在该函数中向该数组添加元素,但如果您不删除该数组,条目将保留在那里(即内存和引用被保留)。因此,当您再次调用该函数时,可以访问以前输入的所有条目。解决方案是在退出函数之前简单地删除动态数组。我假设数组没有被删除,因为数组是在堆上而不是堆栈上实例化的,并且编译器不知道何时对它进行垃圾收集,因为它可能是一个返回的引用(如果我错了,请纠正我-我不熟悉动态数组的垃圾收集规则) 但是,如果动态数组在类中实例化(作为成员变量),会发生什么情况?如何知道是否删除了动态数组(即删除了引用和内存)?这种情况下的垃圾收集规则是什么 我有示例代码来演示这个问题,如果它有帮助的话,但是我认为没有必要包括它(如果您想要一个示例,请告诉我)。 另外,关联数组也会发生同样的情况(因为我认为它是SystemVerilog中动态数组类型的一种形式)Arrays SystemVerilog:一旦类对象不再被引用,动态数组(类内)是否保证被垃圾收集?,arrays,garbage-collection,associative-array,system-verilog,dynamic-arrays,Arrays,Garbage Collection,Associative Array,System Verilog,Dynamic Arrays,所以我的问题是:“标题”和SystemVerilog中动态数组的垃圾收集规则是什么 上下文: 在我的程序中,我发现了一个bug,您可以在函数中实例化一个动态数组(本地),并在该函数中向该数组添加元素,但如果您不删除该数组,条目将保留在那里(即内存和引用被保留)。因此,当您再次调用该函数时,可以访问以前输入的所有条目。解决方案是在退出函数之前简单地删除动态数组。我假设数组没有被删除,因为数组是在堆上而不是堆栈上实例化的,并且编译器不知道何时对它进行垃圾收集,因为它可能是一个返回的引用(如果我错了,
谢谢 SystemVerilog有三种不同类型的变量生存期:
- 静态——在模拟的整个生命周期内都存在。在时间0初始化一次。可以从其声明的范围之外引用
- 自动——为声明它的作用域(必须是过程作用域)的每个条目创建并初始化一个新实例。它的生存期在退出作用域时结束,所有嵌套的作用域退出(处理
)只能从声明它的作用域中引用fork/join\u none
- 动态——通过执行过程语句创建。它的生命周期可以通过多种方式结束,但通常通过执行过程语句来结束
顺便说一句,这成了我的主题,很可能你所看到的bug实际上是静态变量的正常行为。因此,在这种情况下需要一个例子。如果类包含非静态数组成员,则应在垃圾收集该类后立即回收其内存,并且仅当该数组未在其他任何地方引用时。如果你发现了问题,那么你必须和工具提供商谈谈。好的,这是有道理的。所以我认为系统verilog有“static”和“automatic”这样的关键字来控制变量生命周期的这个属性。这是正确的吗?对于一些例子,请参见感谢Dave,systemverilog的细微差别似乎比我最初想象的要多得多。