在Z3中有2种模式:自动参考计数和手动。
我理解手动引用计数的工作原理。谢谢你的例子。
但Z3如何知道何时在自动引用计数中删除AST节点? 由于Z3_ast是来自C语言的结构=>在Z3创建之后,无法跟踪Z3_ast之外的所有分配和用法。
或Z3仅在Z3内跟踪引用?如果您执行以下操作,则不会对ref计数器进行更新:ast1 = ast2。
答案 0 :(得分:5)
自动模式使用非常简单的策略。每当AST返回给用户时,Z3将其存储在堆栈S
上并递增其引用计数器。
执行Z3_push
函数时,Z3会保存堆栈S
的大小。当执行匹配Z3_pop
时,将恢复堆栈S
的大小,并且从堆栈弹出的AST的引用计数器递减。
这种模式非常容易使用,但它有一个主要问题:内存消耗。例如,如果未使用Z3_push
和Z3_pop
,则永远不会删除用户创建的所有AST。