1

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

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

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

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

谢谢

4

2 回答 2

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.

于 2012-08-31T20:09:06.907 回答
3

您可以尝试在插入函数中放置条件断点std::map

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

您可以在每个断点上添加一个条件来捕获将大小增加到 138_Mysize == 137的插入。map

最可能的罪魁祸首可能是,operator[]因为很容易错误地将其视为仅访问器。

于 2012-08-31T20:11:37.793 回答