Memory management for dynamic inlets/outlets

Luigi Castelli's icon

Hi folks,

I am experimenting with dynalic inlets/outlets and they work like a charm.
The only thing I am still uncertain about is the memory management associated with them.
I am working on a DSP UI object and I have a scenario where I instantiate dynamic outlets in myobj_new() method as such:

void *myobj_new(t_symbol *s, long ac, t_atom *av)
{
    t_dictionary *d;
    t_myobj *x;
    long flags;

    if (!(d = object_dictionaryarg(ac, av))) {
        return NULL;
    }
    if (!(x = object_alloc(s_myobj_class))) {
        return NULL;
    }
    flags = 0
            | JBOX_DRAWFIRSTIN
            | JBOX_NODRAWBOX
            | JBOX_DRAWINLAST
            | JBOX_GROWBOTH
            ;
    jbox_new(&x->box.z_box, flags, ac, av);
    x->box.z_box.b_firstin = (t_object *)x;

    dsp_setupjbox(&x->box, 1);

    object_obex_store(x, _sym_dumpout, outlet_append((t_object *)x, NULL, NULL));
    x->out_3 = outlet_append((t_object *)x, NULL, gensym("list"));
    x->out_2 = outlet_append((t_object *)x, NULL, gensym("float"));
    x->out_1 = outlet_append((t_object *)x, NULL, gensym("int"));
    outlet_append((t_object *)x, NULL, gensym("signal"));

    attr_dictionary_process(x, d);
    jbox_ready(&x->box.z_box);

    return x;
}

This will create an object with 1 signal inlet and 1 signal outlet, then it will have 3 more message outlets (accepting ints floats and lists respectively) and finally one dumpout outlet stored in the object's obex. Great.
In other parts of my code I manage the number of inlets and outlets with the appropriate functions.
Everything works well so far...

Here is myobj_free() method. That's what I am not so sure about...

static void myobj_free(t_myobj *x)
{
    // is this freeing all signal inlets and outlets???
    dsp_freejbox(&x->box);

    // first remove the dumpout outlet...
    void *outlet = NULL;
    object_obex_lookup(x, gensym("dumpout"), (t_object **)&outlet);
    hashtab_chuckkey(object_obex_get(x), gensym("dumpout"));
    outlet_delete(outlet);

    // ...then remove the other outlets
    outlet_delete(x->out_1);
    outlet_delete(x->out_2);
    outlet_delete(x->out_3);

    jbox_free(&x->box.z_box);
}

So, at the end of my object's life what am I supposed to do with regard to outlets memory management ?
Should I free all outlets like the above or is it redundant/unnecessary ?
Will Max take care of that for me like for regular outlets ?
Does the same go for signal outlets?

Thanks in advance for any help.

- Luigi

Timothy Place's icon

Hi Luigi,

You should never have to worry about freeing outlets. That is taken care of by Max. For inlets you only need to worry if you are creating proxies.

best,
Tim