Boost logo

Boost Users :

Subject: [Boost-users] [smart_ptr] Problem with circular reference detection
From: Jim Barry (jim_at_[hidden])
Date: 2008-09-16 12:16:56


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 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