取消分配以前分配给变量的内存(使用create)



我正在阅读Gforth关于内存分配/释放的手册,但这是我无法理解的。假设我分配了一块内存来容纳四个整数,如下所示:

create foo 1 , 2 , 3 , 4 ,

然后,也许我分配了更多的内存,也许也释放了一些内存,现在我想释放foo。我该怎么做?执行foo freefoo 4 cells free会导致错误。

一个选项是使用forget foo,但这将"取消分配"自定义foo以来定义的所有内容,更糟糕的是Gforth没有实现它。在Gforth中,您必须使用"标记",但这也将恢复标记之后发生的所有内容。

例如(我将向您展示在Gforth解释器中输入它会得到什么,包括解释器的响应(用双星号表示):

marker -unfoo **ok**
create foo 1 , 2 , 3 , 4 , **ok**
/ A test word to get the first thing in foo (1) back
: test foo @ . ; **ok**
test **1 ok** 
-unfoo **ok**
foo
**:8: Undefined word
>>>foo<<<
Backtrace:
$7FAA4EB4 throw
$7FAB1628 no.extensions
$7FAA502C interpreter-notfound1**
test
**:8: Undefined word
>>>test<<<
Backtrace:
$7FAA4EB4 throw
$7FAB1628 no.extensions
$7FAA502C interpreter-notfound1**

该示例旨在说明在执行-unfoo之后,footest都消失了。

这实际上是如何工作的,可能是我移动了口译员作为最后一个添加到字典中的地址。-unfoo将其移回添加foo的地址之前,这相当于释放了foo使用的内存。

这里有另一个参考,这是一个非常好的起点福斯一般。


针对这个答案的评论:

这个问题很相似,这个答案很有帮助。这可能是Gforth文档中最相关的部分。

上面的链接解释了malloc()free()resize()的第四个版本。

因此,在回答您最初的问题时,您可以使用free,但您释放的内存必须由allocateresize分配。

create向字典中添加了一个项目,因此如果您想要回内存,它并不完全是您想要的。我对此的理解可能是不正确的,因为在正常执行过程中,通常不会从字典中删除内容。

存储字符串的最佳方式取决于你想对它做什么。如果你不需要它在程序的整个生命周期内存在,你可以单独使用s",因为它会返回长度和地址。

总的来说,我想说使用create是一个不错的主意,但它确实有局限性。如果字符串发生变化,您将不得不为其create一个新的字典条目。如果您可以设置字符串长度的上限,那么一旦您有了create d一个单词,您就可以返回并覆盖已为其创建allot d的内存。

这是我给出的另一个答案,给出了一个定义字符串的例子。

总之,如果您确实需要能够释放内存,请使用Gforth提供的堆方法(我认为它们在Forth标准中,但我不知道是否所有Forth都实现了它们)。如果你不这样做,你可以根据你的问题使用字典。

CREATE ALLOT和VARIABLE单词占用字典空间(在ISO 93标准中查找)传统上你可以

忘记aap

,但这删除了aap和每个在aap

在复杂的福斯式gforth中,这种简单的机制不再起作用。它相当于截断链表并重置分配指针(HERE/DP)

在Gworth,您必须使用MARKER。放入

MARKER aap

您可以使用aap来删除aapARKER很麻烦,重新启动Forth要容易得多。

相关内容

  • 没有找到相关文章

最新更新