我正在阅读关于内存分配/释放的Gforth手册,这是我无法理解的。假设我分配了一块内存来保存这样的四个整数:
create foo 1 , 2 , 3 , 4 ,
然后,也许我分配了更多内存,也许还释放了一些内存,现在我想解除分配foo
。我怎么做?执行foo free
和foo 4 cells free
会导致错误。
答案 0 :(得分:2)
一个选项是使用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()
的第四版。
因此,在回答原始问题时,您可以使用free
,但您必须通过allocate
或resize
分配您自由的内存。
create
会在字典中添加一个项目,如果您想要恢复内存,那么它就不是您想要的。我对此的理解可能是不正确的,你通常不会在正常执行过程中从字典中删除东西。
存储字符串的最佳方法取决于您想要用它做什么。如果您不需要它在程序的生命周期内存在,您可以单独使用s"
,因为这会返回长度和地址。
一般来说,我会说使用create
是一个很好的主意但它确实有局限性。如果字符串发生变化,您将需要create
一个新的字典条目。如果你可以设置字符串长度的上限,那么一旦你有create
个单词,你可以返回并覆盖allot
为它编写的内存。
This是我给出的另一个答案,给出了定义字符串单词的示例。
总而言之,如果你确实需要能够释放内存,请使用Gforth提供的堆方法(我认为它们符合Forth标准,但我不知道所有Forth是否实现它们)。如果不这样做,您可以根据您的问题使用字典。