Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays SystemVerilog:一旦类对象不再被引用,动态数组(类内)是否保证被垃圾收集?_Arrays_Garbage Collection_Associative Array_System Verilog_Dynamic Arrays - Fatal编程技术网

Arrays SystemVerilog:一旦类对象不再被引用,动态数组(类内)是否保证被垃圾收集?

Arrays SystemVerilog:一旦类对象不再被引用,动态数组(类内)是否保证被垃圾收集?,arrays,garbage-collection,associative-array,system-verilog,dynamic-arrays,Arrays,Garbage Collection,Associative Array,System Verilog,Dynamic Arrays,所以我的问题是:“标题”和SystemVerilog中动态数组的垃圾收集规则是什么 上下文: 在我的程序中,我发现了一个bug,您可以在函数中实例化一个动态数组(本地),并在该函数中向该数组添加元素,但如果您不删除该数组,条目将保留在那里(即内存和引用被保留)。因此,当您再次调用该函数时,可以访问以前输入的所有条目。解决方案是在退出函数之前简单地删除动态数组。我假设数组没有被删除,因为数组是在堆上而不是堆栈上实例化的,并且编译器不知道何时对它进行垃圾收集,因为它可能是一个返回的引用(如果我错了,

所以我的问题是:“标题”和SystemVerilog中动态数组的垃圾收集规则是什么

上下文:

在我的程序中,我发现了一个bug,您可以在函数中实例化一个动态数组(本地),并在该函数中向该数组添加元素,但如果您不删除该数组,条目将保留在那里(即内存和引用被保留)。因此,当您再次调用该函数时,可以访问以前输入的所有条目。解决方案是在退出函数之前简单地删除动态数组。我假设数组没有被删除,因为数组是在堆上而不是堆栈上实例化的,并且编译器不知道何时对它进行垃圾收集,因为它可能是一个返回的引用(如果我错了,请纠正我-我不熟悉动态数组的垃圾收集规则)

但是,如果动态数组在类中实例化(作为成员变量),会发生什么情况?如何知道是否删除了动态数组(即删除了引用和内存)?这种情况下的垃圾收集规则是什么

我有示例代码来演示这个问题,如果它有帮助的话,但是我认为没有必要包括它(如果您想要一个示例,请告诉我)。 另外,关联数组也会发生同样的情况(因为我认为它是SystemVerilog中动态数组类型的一种形式)


谢谢

SystemVerilog有三种不同类型的变量生存期:

  • 静态——在模拟的整个生命周期内都存在。在时间0初始化一次。可以从其声明的范围之外引用
  • 自动——为声明它的作用域(必须是过程作用域)的每个条目创建并初始化一个新实例。它的生存期在退出作用域时结束,所有嵌套的作用域退出(处理
    fork/join\u none
    )只能从声明它的作用域中引用
  • 动态——通过执行过程语句创建。它的生命周期可以通过多种方式结束,但通常通过执行过程语句来结束
动态大小的数组有一个复合的生命周期概念。单个元素具有动态生存期,但作为一个整体的数组聚合可以具有上述任何一种生存期。为了你的问题,我想我们可以把数组看作一个集合。这意味着每当数组变量的生存期结束时,所有动态分配的元素都会被回收

类对象具有动态生存期,但包含引用类对象的句柄的类变量可以包含上述任何生存期。但是由于不止一个类变量可以引用同一个类对象,因此当没有更多的类变量引用该对象时,类对象的生存期结束。因此,如果该类对象包含动态数组变量,则这些变量的生存期将在对象的生存期结束时结束

SystemVerilog没有指定垃圾收集的工作方式。当某物的生命周期结束时,您无法再访问它。没有办法知道内存何时被回收

您的问题似乎是在函数中有一个静态声明的动态数组,或者是一个静态函数参数。在Verilog中,默认情况下,所有非类函数都有静态生存期。类方法只能具有自动生存期。如果这个解释不能回答您的问题,您需要发布一些代码



顺便说一句,这成了我的主题

,很可能你所看到的bug实际上是静态变量的正常行为。因此,在这种情况下需要一个例子。如果类包含非静态数组成员,则应在垃圾收集该类后立即回收其内存,并且仅当该数组未在其他任何地方引用时。如果你发现了问题,那么你必须和工具提供商谈谈。好的,这是有道理的。所以我认为系统verilog有“static”和“automatic”这样的关键字来控制变量生命周期的这个属性。这是正确的吗?对于一些例子,请参见感谢Dave,systemverilog的细微差别似乎比我最初想象的要多得多。