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.