In Z3 there are 2 modes: automatic reference counting and manual.
I understand how manual ref counting works. Thanks to example.
But how does Z3 know when to delete AST node in automatic ref-counting case?
Since Z3_ast is a struct from C language => it is impossible to track all assignments and usages of Z3_ast outside Z3 after it was created.
Or Z3 track references inside Z3 only? That is no updates to ref counters are made if you do for example: ast1 = ast2.
The automatic mode uses a very simple policy. Whenever an AST is returned to the user, Z3 stores it on a stack
Sand increments its reference counter.When the
Z3_pushfunction is executed, Z3 saves the size of the stackS. When the matchingZ3_popis executed, the size of the stackSis restored, and the reference counter of the ASTs popped from the stack is decremented.This mode is very easy to use, but it has a main problem: memory consumption. For example, if
Z3_pushandZ3_popare not used, then all ASTs created by the user will never be deleted.