在C+中遍历Z3#ast时重写它+;

在C+中遍历Z3#ast时重写它+;,z3,abstract-syntax-tree,Z3,Abstract Syntax Tree,to_expr函数会导致错误。你能告诉我下面出了什么问题吗 context z3_cont; expr x = z3_cont.int_const("x"); expr y = z3_cont.int_const("y"); expr ge = ((y==3) && (x==2)); ge = swap_tree( ge ); 其中,swap_tree是一个应交换二进制操作的所有操作数的函数。它的定义如下 expr swap_tree( expr e ) { Z3_ast

to_expr
函数会导致错误。你能告诉我下面出了什么问题吗

context z3_cont;
expr x = z3_cont.int_const("x");
expr y = z3_cont.int_const("y");
expr ge = ((y==3) && (x==2));
ge = swap_tree( ge );
其中,
swap_tree
是一个应交换二进制操作的所有操作数的函数。它的定义如下

expr swap_tree( expr e ) {
  Z3_ast ee[2];
  if ( e.is_app() && e.num_args() == 2) {
    for ( int i = 0; i < 2; ++i ) {
     ee[ 1 - i ] = swap_tree( e.arg(i) );
    }   
    for ( int i = 0; i < 2; ++i ) {
      cout <<" ee[" << i << "] : " << to_expr( z3_cont, ee[ i ] ) << endl;
    }
    return to_expr( z3_cont, Z3_update_term( z3_cont, e, 2, ee ) );
  }
  else 
    return e;
}
expr交换树(expr e){
Z3_ast ee[2];
如果(e.is_app()&&e.num_args()==2){
对于(int i=0;i<2;++i){
ee[1-i]=swap_树(e.arg(i));
}   
对于(int i=0;i<2;++i){
如果引用计数器为0,则Z3对象可以被系统垃圾回收。Z3C++ API提供“智能指针”(<代码> EXPR< <代码> > <代码>排序> <代码> >……),用于自动管理参考计数器。您的代码使用<代码> Z3ASASE EE [ 2 ]。
。在for循环中,您将
交换树(e.arg(0))
的结果存储到
ee[0]
中。由于引用计数器未递增,因此在执行循环的第二次迭代时,可能会删除此Z3对象

以下是一个可能的修复方法:

expr交换树(expr e){
如果(e.is_app()&&e.num_args()==2){
//使用智能指针存储中间结果。
expr ee0(z3续)、ee1(z3续);
ee0=交换树(e.arg(0));
ee1=交换树(e.arg(1));
Z3_ast ee[2]={ee1,ee0};
返回到expr(z3_cont,z3_update_term(z3_cont,e,2,ee));
}
否则{
返回e;
}
}