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 , 14 years ago
Status: | new → assigned |
---|
comment:2 by , 14 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Note:
See TracTickets
for help on using tickets.
(In [48832]) Fix #2338.