HOWTO resolve circular references in ns-3 memory disposal: Difference between revisions

From Nsnam
Jump to navigation Jump to search
Line 29: Line 29:
     ==15749==    suppressed: 0 bytes in 0 blocks
     ==15749==    suppressed: 0 bytes in 0 blocks


The preferred way to handle reference cycles like this in ns-3 is to use Object::Dispose().  This method will call the DoDispose method on the object that it is called on as well as all other objects aggregated on to it.
The preferred way to handle reference cycles like this in ns-3 is to use Object::Dispose().  This method will call the DoDispose method on the object that it is called on as well as all other objects aggregated on to it. In the above example Class A is aggregated to Class B so we make the following change to class A:
 
    class A : public Object
    {
    public:
        static TypeId GetTypeId (void);
        Callback<void> m_callback;
        virtual void DoDispose (void)
        {
          m_callback = MakeNullCallback<void>();
        }
    };

Revision as of 17:48, 30 August 2013

HOWTO resolve smart pointer circular references in ns-3 memory disposal

    class A : public Object
    {
    public:
       static TypeId GetTypeId (void);
       Callback<void> m_callback;
    };
    class B : public Object
    {
    public:
       static TypeId GetTypeId (void);
       void CallbackMethodB (void);
    };
     int main(int argc, char* argv[])
     {
        Ptr<A> a = CreateObject<A>();
        Ptr<B> b = CreateObject<B>();
        a->m_callback = MakeCallback (&B::CallbackMethodB, b);
        b->AggregateObject(a);
     }
     
    ==15749== LEAK SUMMARY:
    ==15749==    definitely lost: 40 bytes in 1 blocks
    ==15749==    indirectly lost: 152 bytes in 5 blocks
    ==15749==    possibly lost: 0 bytes in 0 blocks
    ==15749==    still reachable: 10,360 bytes in 5 blocks
    ==15749==    suppressed: 0 bytes in 0 blocks

The preferred way to handle reference cycles like this in ns-3 is to use Object::Dispose(). This method will call the DoDispose method on the object that it is called on as well as all other objects aggregated on to it. In the above example Class A is aggregated to Class B so we make the following change to class A:

    class A : public Object
    {
    public:
       static TypeId GetTypeId (void);
       Callback<void> m_callback;
       virtual void DoDispose (void)
       {
          m_callback = MakeNullCallback<void>();
       }	
    };