我正在阅读Gforth关于内存分配/释放的手册,但这是我无法理解的。假设我分配了一块内存来容纳四个整数,如下所示:
create foo 1 , 2 , 3 , 4 ,
然后,也许我分配了更多的内存,也许也释放了一些内存,现在我想释放foo
。我该怎么做?执行foo free
和foo 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
之后,foo
和test
都消失了。
这实际上是如何工作的,可能是我移动了口译员作为最后一个添加到字典中的地址。-unfoo
将其移回添加foo
的地址之前,这相当于释放了foo
使用的内存。
这里有另一个参考,这是一个非常好的起点福斯一般。
针对这个答案的评论:
这个问题很相似,这个答案很有帮助。这可能是Gforth文档中最相关的部分。
上面的链接解释了malloc()
、free()
和resize()
的第四个版本。
因此,在回答您最初的问题时,您可以使用free
,但您释放的内存必须由allocate
或resize
分配。
create
向字典中添加了一个项目,因此如果您想要回内存,它并不完全是您想要的。我对此的理解可能是不正确的,因为在正常执行过程中,通常不会从字典中删除内容。
存储字符串的最佳方式取决于你想对它做什么。如果你不需要它在程序的整个生命周期内存在,你可以单独使用s"
,因为它会返回长度和地址。
总的来说,我想说使用create
是一个不错的主意,但它确实有局限性。如果字符串发生变化,您将不得不为其create
一个新的字典条目。如果您可以设置字符串长度的上限,那么一旦您有了create
d一个单词,您就可以返回并覆盖已为其创建allot
d的内存。
这是我给出的另一个答案,给出了一个定义字符串的例子。
总之,如果您确实需要能够释放内存,请使用Gforth提供的堆方法(我认为它们在Forth标准中,但我不知道是否所有Forth都实现了它们)。如果你不这样做,你可以根据你的问题使用字典。
CREATE ALLOT和VARIABLE单词占用字典空间(在ISO 93标准中查找)传统上你可以
忘记aap
,但这删除了aap和每个在aap 在复杂的福斯式gforth中,这种简单的机制不再起作用。它相当于截断链表并重置分配指针(HERE/DP) 在Gworth,您必须使用MARKER。放入 您可以使用aap来删除aapARKER很麻烦,重新启动Forth要容易得多。MARKER aap