Pointers 在SWIG输入类型映射中释放指针数组的正确方法?

Pointers 在SWIG输入类型映射中释放指针数组的正确方法?,pointers,lua,swig,lua-table,typemaps,Pointers,Lua,Swig,Lua Table,Typemaps,嗨,我正在尝试使用SWIG包装以下函数 static void readTable(int argc, t_atom *argv) { //accepts table in Lua e.g. readTable({"ab",3}); for (int i=0; i<argc; ++i) { if (argv[i].a_type == A_FLOAT) printf("FLOAT : %g\n", argv[i].a

嗨,我正在尝试使用SWIG包装以下函数

static void readTable(int argc, t_atom *argv) { //accepts table in Lua e.g. readTable({"ab",3});

        for (int i=0; i<argc; ++i) {

            if (argv[i].a_type == A_FLOAT)
                printf("FLOAT : %g\n", argv[i].a_w.w_float);
            else if (argv[i].a_type == A_SYMBOL)
                printf("SYMBOL : %s\n", argv[i].a_w.w_symbol->s_name);
        }
    }
我的问题是

a) 当我在SWIG界面中释放内存时,
readTable()
如何在不崩溃的情况下打印结果?也许内存没有被正确释放

b) 如果a)没有意义或使用不安全,您是否建议改为调用函数
readTable()
中的
freebytes()
,以便如下所示

static void readTable(int argc, t_atom *argv) {

        for (int i=0; i<argc; ++i) {

            if (argv[i].a_type == A_FLOAT)
                post("FLOAT : %g", argv[i].a_w.w_float);
            else if (argv[i].a_type == A_SYMBOL)
                post("SYMBOL : %s", argv[i].a_w.w_symbol->s_name);
        }
        freebytes(argv, argc * sizeof(t_atom));
    }
静态void可读表(int argc,t_atom*argv){
for(int i=0;是_name);
}
自由字节(argv,argc*sizeof(t_原子));
}

这正是我们要面对的情况

%包括“exception.i”
%类型映射(in)(int-argc,t_-atom*argv){
如果(!lua_istable(L,$input)){
SWIG_异常(SWIG_运行时错误,“参数不匹配:应为表”);
}
卢阿伦(L$输入);
$1=卢阿托因特尔(L,-1);
$2=(t_atom*)getbytes($1*sizeof(t_atom));//内部调用calloc()
对于(整数i=0;i<$1;++i){
lua_整数(L,i+1);
lua_gettable(L$input);
if(lua_isnumber(L,-1)){
$2[i]。a_类型=a_浮动;
$2[i].a_w.w_float=lua_tonumber(L,-1);
}else-if(lua_-isstring(L,-1)){
$2[i]。a_类型=a_符号;
$2[i].a_w.w_symbol=gensym(lua_tostring(L,-1));
}否则{
SWIG_异常(SWIG_运行时错误,“未处理的参数类型”);
}
}
}
%typemap(freearg)(int-argc,t_-atom*argv){
freebytes($2,$1*sizeof(t_atom));//内部调用free()
}
静态void可读表(const std::string&name,int argc,t_atom*argv);
这是从SWIG 3.0生成的代码

static int\u wrap\u readTable(lua\u State*L){
int SWIG_arg=0;
std::string*arg1=0;
int-arg2;
t_原子*arg3=(t_原子*)0;
SWIG_check_num_args(“可读”,2,2)
如果(!lua_isuserdata(L,1))SWIG_fail_arg(“readTable”,1,“std::string const&”);
如果(!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)和arg1,SWIGTYPE_p_std_string,0))){
SWIG_fail_ptr(“可读取”,1,SWIGTYPE_p_std_字符串);
}
{
如果(!lua_istable(L,2)){
SWIG_异常(SWIG_运行时错误,“参数不匹配:应为表”);
}
卢阿伦(L,2);
arg2=lua_tointeger(L,-1);
arg3=(t_atom*)getbytes(arg2*sizeof(t_atom));//内部调用calloc()
对于(int i=0;i这是C还是C++?我对B的回答很大程度上取决于这一点。“柔性版是C++的。@ Flexo,请你读下面的第三条评论好吗?非常感谢。@ZackLee您可能注意到我在表转换中添加了一个
else
分支,以防止出现分段错误。@ZackLee我不知道,这可能是不可能的。SWIG类型映射依赖于函数签名的简单模式匹配,请参见
%apply
仅用于复制类型映射,而不用于部分匹配,请参见@ZackLee好吧,表格不再是第一个参数,而是第二个参数,因此您必须将类型映射内的检查从
if(!lua_istable(L,1))
调整为
if(!lua_istable)(L,$input))
,另请参见更新后的答案。@ZackLee问题一有答案,最低悬赏就从50提高到100。
FLOAT : 3
SYMBOL : abc
static void readTable(int argc, t_atom *argv) {

        for (int i=0; i<argc; ++i) {

            if (argv[i].a_type == A_FLOAT)
                post("FLOAT : %g", argv[i].a_w.w_float);
            else if (argv[i].a_type == A_SYMBOL)
                post("SYMBOL : %s", argv[i].a_w.w_symbol->s_name);
        }
        freebytes(argv, argc * sizeof(t_atom));
    }