¿Forma correcta de liberar una matriz de punteros en el mapa de tipos de entrada SWIG?

Hola, estoy tratando de ajustar la siguiente función usando 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);
        }
    }

Aquí está el mapa de tipos que creé.

%include "exception.i"
%typemap(in) (int argc, t_atom *argv)
{
    if (!lua_istable(L, 1)) {
      SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected");
    }
    lua_len(L, 1);
    $1 = lua_tointeger(L, -1);
    $2 = (t_atom *)getbytes($1 * sizeof(t_atom)); //internally calls calloc()

    for (int i=0; i<$1; ++i) {

        lua_pushinteger(L, i+1);
        lua_gettable(L, 1);

        if(lua_isnumber(L, -1)) {

            $2[i].a_type = A_FLOAT;
            $2[i].a_w.w_float = lua_tonumber(L, -1);
        }          
        else if(lua_isstring(L, -1)) {

            $2[i].a_type = A_SYMBOL;
            $2[i].a_w.w_symbol = gensym(lua_tostring(L, -1));
        }
    }
    freebytes($2, $1 * sizeof(t_atom)); //internally calls free()
}

omo puede ver, asigno memoria para una matriz usandogetbytes() que internamente llama acalloc() y libera la memoria usandofreebytes() que internamente llama afree().

orprendentemente, cuando llamo areadTable() función en Lua, funciona bien sin fallar.

por ejemplo, llamando atest.readTable({3, "abc"}) en Lua imprime el siguiente resultado.

FLOAT : 3
SYMBOL : abc

Mis preguntas son

a) ¿Cómo puedereadTable() imprimir resultados sin fallar cuando liberé la memoria en la interfaz SWIG? ¿Quizás la memoria no se está liberando correctamente?

b) Si a) no tiene sentido o no es seguro de usar, ¿recomendaría llamar afreebytes() dentro de la funciónreadTable() en cambio, ¿puede ser así?

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));
    }

Respuestas a la pregunta(1)

Su respuesta a la pregunta