Opened 14 years ago

Closed 14 years ago

#2338 closed Bugs (fixed)

sp_collector.cpp reports reachable objects as unreachable

Reported by: Peter Dimov Owned by: Peter Dimov
Milestone: Boost 1.37.0 Component: smart_ptr
Version: Boost 1.36.0 Severity: Problem
Keywords: Cc:

Description

Jim Barry in http://lists.boost.org/boost-users/2008/09/40507.php:

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.

Change History (2)

comment:1 by Peter Dimov, 14 years ago

Status: newassigned

comment:2 by Peter Dimov, 14 years ago

Resolution: fixed
Status: assignedclosed

(In [48832]) Fix #2338.

Note: See TracTickets for help on using tickets.