一种选择是使用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**
这个例子是为了说明foo和test在你执行-unfoo之后都消失了。
这实际上是如何工作的可能是我移动了解释器作为最后添加到字典中的地址。 -unfoo 将其移回到添加foo 的地址之前,相当于释放foo 使用的内存。
这里是这个Starting Forth 的另一个参考资料,它非常适合学习 Forth。
回应对此答案的评论:
This question 非常相似,this answer 非常有用。 This 可能是 Gforth 文档中最相关的部分。
上面的链接解释了malloc()、free()和resize()的Forth版本。
因此,在回答您最初的问题时,您可以使用free,但您释放的内存必须由allocate 或resize 分配。
create 将一个项目添加到字典中,因此如果您想要恢复内存,这并不是您想要的。我对此的理解可能不正确,因为在正常执行过程中您通常不会从字典中删除内容。
存储字符串的最佳方式取决于您想用它做什么。如果您不需要它在程序的生命周期内存在,您可以单独使用s",因为它会返回一个长度和一个地址。
总的来说,我会说使用create 是个好主意,但它确实有局限性。如果字符串发生变化,您将不得不为它create 一个新的字典条目。如果您可以设置字符串长度的上限,那么一旦您有了created 一个单词,您就可以返回并覆盖已为它使用alloted 的内存。
This 是我给出的另一个答案,它给出了定义字符串单词的示例。
总而言之,如果您确实需要能够释放内存,请使用 Gforth 提供的堆方法(我认为它们在 Forth 标准中,但我不知道是否所有 Forth 都实现了它们)。如果你不这样做,你可以根据你的问题使用字典。