Boost logo

Boost Users :

Subject: Re: [Boost-users] [smart_ptr] Problem with circular reference detection
From: peter_foelsche_at_[hidden]
Date: 2008-09-16 17:41:42


What kind of design needs circular smart pointers?
I cannot think of anything I would design this way.
I usually use normal pointers somewhere to break circular references.
These normal pointers get removed on destruction of the object, e.g.:

static std::map<std::string, CClass *> s_sNameToObject;

The constructor of the CClass would create the entry in the map and the destructor would remove it.

Also I use Reference count forwarding together with normal pointers,
in case of an entire tree must be kept alive in case of somebody holds a reference to a child object.

Also I would try to avoid using smart_ptr, since it must allocate another object (to store the reference count) using operator new.
Use the intrusive smart pointer instead.

-----Original Message-----
From: boost-users-bounces_at_[hidden] [mailto:boost-users-bounces_at_[hidden]] On Behalf Of Jim Barry
Sent: Tuesday, September 16, 2008 09:17
To: boost-users_at_[hidden]
Subject: [Boost-users] [smart_ptr] Problem with circular reference detection

I am trying to detect circular references using the find_unreachable_objects function in sp_collector.cpp. However, it reports false positives in the simple case of one object being owned by another. To illustrate:

  #define BOOST_SP_ENABLE_DEBUG_HOOKS
  #include <boost/shared_ptr.hpp>

  // sp_collector.cpp exported functions
  std::size_t find_unreachable_objects(bool report);

  struct X {};

  struct Y
  {
    boost::shared_ptr<X> pX;

    Y() : pX(new X) {}
  };

  int main()
  {
    boost::shared_ptr<Y> y(new Y);
    find_unreachable_objects(true);
    return 0;
  }

The output is as follows:

  ... 2 objects in m.
  ... 1 objects in m2.
  ... 1 objects in open.
  Unreachable object at 0036BA60, 12 bytes long.

Clearly this is incorrect as there are no circular references. Looking at the code, there is what appears to be a typo at line 124:

  std::cout << "... " << m2.size() << " objects in open.\n";

should be:

  std::cout << "... " << open.size() << " objects in open.\n";

But the real problem seems to be at line 121:

  if(p->use_count() != i->second) open.push_back(p);

I'm not entirely sure what's going on in this section of code, but it ends up determining (incorrectly) that the "X" object is unreachable. Is there any way to get this working properly?

Thanks,

- Jim

_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net