为什么以下代码不起作用?我收到运行时错误。
#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。
答案 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));