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

From Nsnam
Jump to navigation Jump to search
Line 1: Line 1:
== HOWTO resolve smart pointer circular references in ns-3 memory disposal ==
== HOWTO resolve smart pointer circular references in ns-3 memory disposal ==
<code>
 
     class A : public Object
     class A : public Object
     {
     {
Line 15: Line 15:
         Callback<void> m_callback;
         Callback<void> m_callback;
     };
     };
</code>
    <pre>
<code>
     int main(int argc, char* argv[])
     int main(int argc, char* argv[])
     {
     {
         Ptr<A> a = CreateObject<A>();
         Ptr<A> a = CreateObject<A>();
         Ptr'<B>' b = CreateObject<B>();
         Ptr<B> b = CreateObject<B>();
         a->m_callback = MakeCallback (&B::CallbackMethodB, b);
         a->m_callback = MakeCallback (&B::CallbackMethodB, b);
         b->m_callback = MakeCallback (&A::CallbackMethodA, a);
         b->m_callback = MakeCallback (&A::CallbackMethodA, a);
     }
     }
</code>
    </pre>
or  
or  
<code>
 
     int main(int argc, char* argv[])
     int main(int argc, char* argv[])
     {
     {
Line 34: Line 33:
         b->AggregateObject(a);
         b->AggregateObject(a);
     }
     }
</code>
 
<code>
     ==15749== LEAK SUMMARY:
     ==15749== LEAK SUMMARY:
     ==15749==    definitely lost: 40 bytes in 1 blocks
     ==15749==    definitely lost: 40 bytes in 1 blocks
Line 42: Line 40:
     ==15749==    still reachable: 10,360 bytes in 5 blocks
     ==15749==    still reachable: 10,360 bytes in 5 blocks
     ==15749==    suppressed: 0 bytes in 0 blocks
     ==15749==    suppressed: 0 bytes in 0 blocks
</code>

Revision as of 16:52, 30 August 2013

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

    class A : public Object
    {
    public:
       static TypeId GetTypeId (void);
       void CallbackMethodA();
       Callback<void> m_callback;
    };
    class B : public Object
    {
    public:
       static TypeId GetTypeId (void);
       void CallbackMethodB();
       Callback<void> m_callback;
    };
     int main(int argc, char* argv[])
     {
        Ptr<A> a = CreateObject<A>();
        Ptr<B> b = CreateObject<B>();
        a->m_callback = MakeCallback (&B::CallbackMethodB, b);
        b->m_callback = MakeCallback (&A::CallbackMethodA, a);
     }
     

or

    int main(int argc, char* argv[])
    {
       Ptr<A> a = CreateObject<A>();
       Ptr b = CreateObject();
       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