| Ownership of dynamic objects |
| ---------------------------- |
| |
| Any object-oriented system or language that doesn't have automatic garbage |
| collection has many potential pitfalls as far as the pointers go. Therefore, |
| some standards must be adhered to as far as who owns what. |
| |
| Strings |
| ~~~~~~~ |
| |
| Arguments passed into a function are owned by the caller, and the function |
| will make a copy of the string for its own internal use. The string should |
| be const gchar *. Strings returned from a function are always a copy of the |
| original and should be freed after usage by the caller. |
| |
| ex: |
| |
| name = gst_element_get_name (element); /* copy of name is made */ |
| .. use name .. |
| g_free (name); /* free after usage */ |
| |
| |
| Objects |
| ~~~~~~~ |
| |
| Objects passed into a function are owned by the caller, any additional |
| reference held to the object after leaving the function should increase the |
| refcount of that object. |
| |
| Objects returned from a function are owned by the caller. This means that the |
| called should _free() or _unref() the object after usage. |
| |
| ex: |
| |
| peer = gst_pad_get_peer (pad); /* peer with increased refcount */ |
| if (peer) { |
| .. use peer .. |
| gst_object_unref (GST_OBJECT (peer)); /* unref peer after usage */ |
| } |
| |
| |
| Iterators |
| ~~~~~~~~~ |
| |
| When retrieving multiple objects from an object an iterator should be used. |
| The iterator allows you to access the objects one after another while making |
| sure that the set of objects retrieved remains consistent. |
| |
| Each object retrieved from an iterator has its refcount increased or is a |
| copy of the original. In any case the object should be unreffed or freed |
| after usage. |
| |
| |
| |