[heap] Singular handle issue with MSVC iterator debug facilities

Hi, Using VS2017 and Boost 1.64, I'm compiling a program which uses boost::heap::d_ary_heap. In debug configuration (with default _ITERATOR_DEBUG_LEVEL), I'm observing issues at run-time when a handle of item on the heap is compared against default-constructed instance of handle_type. BTW, the handle_type compiled in is based on std::list::iterator as defined in boost::heap::detail::priority_queue_mutable_wrapper. The issue is that MSVC iterator debug facilities break execution with File: c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.10.25017\include\list Line: 290 Expression: list iterators incompatible AFAIU, handle_type{}; seems to yield handle h object wrapping singular iterator. Below, minimal example to reproduces the problem is included. While debugging the sample, Visual C++ debugger does not show the iterator wrapped by the handle as default-constructed with null node pointer. Instead, it displays garbage: ((???, ???), ???) // ------------------------------------------------------------------ #include <cstdint> #include <functional> #include <boost/heap/d_ary_heap.hpp> using NodeID = std::uint32_t; using EdgeWeight = std::int32_t; using HeapData = std::pair<EdgeWeight, NodeID>; using HeapContainer = boost::heap::d_ary_heap< HeapData, boost::heap::arity<4>, boost::heap::mutable_<true>, boost::heap::compare<std::greater<HeapData>>>; using HandleType = HeapContainer::handle_type; int main() { HeapContainer heap; auto const handle = heap.push(std::make_pair(100, 1)); handle == HandleType{}; // _DEBUG_ERROR("list iterators incompatible"); return 0; } // ------------------------------------------------------------------ Is this a known MSVC drawback while working with boost::heap::d_ary_heap or above the handle_type is actually misused? Best regards, -- Mateusz Loskot, http://mateusz.loskot.net
participants (1)
-
Mateusz Loskot