发现元素何时插入std :: map

时间:2012-08-31 19:46:31

标签: c++ visual-studio-2010 debugging map

我的程序正在插入(带[]运算符])一些数据[地址]到std :: map中。我可以跟踪137个元素的插入。它们都插入了有效值。

在某个阶段,我迭代地图并尝试使用值[地址]进行一些操作 我在开始迭代地图之前设置了一个断点。 当我在调试器中检查地图时,我仍然看到137个元素。但是当我迭代它直到

iterator != map.end我发现,地图有138个值 - 最后一个是非法的。

我需要找到一种方法来检测何时插入最后一个有问题的值。我使用VS 2010。

谢谢

2 个答案:

答案 0 :(得分:6)

您可以,仅用于调试,将std::map替换为隐藏std::map::insert成员函数的包装类,并打印出调试信息。

#include <map>
#include <iostream>
#include <utility>
#include <string>

template<class Key, 
         class Value, 
         class Compare = std::less<Key>, 
         class Allocator = std::allocator<std::pair<const Key, Value>>>
struct wrap_map : std::map<Key, Value, Compare, Allocator>
{
  typedef std::map<Key, Value, Compare, Allocator> base_type;

  std::pair<iterator,bool> insert( const value_type& value )
  {
    std::cout << "Inserted: [" << value.first << "] : " << value.second << std::endl;
    return base_type::insert( value );
  }
};

int main()
{
  wrap_map<int, std::string> mymap;

  mymap.insert( std::make_pair( 10, std::string( "Hello, World!" ) ) );
  std::cout << mymap[10] << std::endl;
}

输出:

Inserted: [10] : Hello, World!
Hello, World!

您必须为您在代码中使用的std::map::insert的任何其他重载创建重载,如果您使用std::map::operator[]将元素插入地图,则必须创建重载。

您还可以打印出__LINE__等宏来指示插入的位置。

请注意,std::map没有虚拟析构函数,因此如果您正在动态分配映射,那么使用此方法可能会导致未定义的行为,除非您使用wrap_map替换所有类型名称。

答案 1 :(得分:3)

您可以尝试在std::map

的插入函数中放置条件断点

对我来说(使用VC10),适当的位置是C:\ Program Files(x86)\ Microsoft Visual Studio 10.0的第755行(std::map::insert)和第767行(std::map::operator[]) VC \包括\的XTree

您可以在_Mysize == 137的每个断点处添加条件以捕获插入,从而将map大小增加到138.

最可能的罪魁祸首可能是operator[],因为很容易将其误认为只是一个访问者。