混合Z3 c和c ++ apis

时间:2014-07-11 21:05:41

标签: z3

为什么以下代码不起作用?我收到运行时错误。

#include <iostream>
#include "z3++.h"

using namespace std;

int main()
{
    z3::context c;
    z3::expr a = c.bv_val(12,16);
    Z3_ast a0 = Z3_mk_extract(a.ctx(),0,0,a);
    Z3_ast a1 = Z3_mk_extract(a.ctx(),1,1,a);
    Z3_ast a2 = Z3_mk_extract(a.ctx(),2,2,a);
    cout << Z3_ast_to_string(a.ctx(),a0);
    cout << Z3_ast_to_string(a.ctx(),a1);  // <-- BOOM
    cout << Z3_ast_to_string(a.ctx(),a2);
}

如果我只使用C api,它的效果非常好。我以为我可以轻松混合两个api ......

A.G。

1 个答案:

答案 0 :(得分:3)

从C API函数(例如Z3_mk_extract)中,您必须自己维护已创建对象的引用计数器。 C ++包装器自动增加&#34; expr&#34;中的引用计数。类。 因此,修复代码的一种方法是在exprs中包装a0,a1,a2。例如,你可以说:

 z3::expr a0 = z3::expr(c, Z3_mk_extract(a.ctx(),0,0,a));