STL Map.使用VS2010在调试和发布方面的表现不同

stl map.find perform differently in debug and release using vs2010

本文关键字:方面 使用 Map VS2010 调试 STL      更新时间:2023-10-16

我正在使用stl映射存储从PCAP文件中提取的流程信息。当数据包到来时,我使用map.act。查找数据包属于的流程是否存在。我必须使用映射。从a到b的数据包,从b到a的数据包属于同一流。

struct FiveTuple
{
unsigned short source_port;
unsigned short dest_port;
unsigned int source_ip_addr;
unsigned int dest_ip_addr;
unsigned char transport_proto_type;
};

fivetuple识别流动。我使用fivetuple作为地图中的关键元素。

地图是地图<Fivetuple,Flow,FlowCMP>,其中FlowCMP是使用MEMCMP的结构,以查看Fivetuple A是否小于Fivetuple B,就像运算符<。要查找数据包的流程是否存在,我编写的代码如下,其中m是地图的名称,而五_ tuple是一个fivetuple,其中包含从数据包中提取的信息:

auto it = m.find(five_tuple);
if( it == m.end())
{
     //swap source and dest ip/port in five_tuple,
    it = m.find(five_tuple);
    if(it == m.end())
    {
          //do something
    }
}

在VS2010中的调试版本中,结果是合理的。当我将其更改为发行版本时,我发现第二次M.Find并没有返回正确的迭代器,而是大部分时间都给了我M.End。我发现没有初始化问题。如何解决发布版本问题?

似乎您正在fivetuple对象上执行memcmp()。那是不确定的行为,因为fivetuple包含落后的垃圾字节。这些尾随垃圾字节在调试版本和发行版中有所不同,因此您会获得不同的结果。您应该重写FlowCMP,以便它不使用memcmp()。

这是基于提供的有限信息的猜测,但是如果要测试,请尝试cout << sizeof(FiveTuple);。我敢打赌,您会看到sizeof(FiveTuple) > sizeof(short) + sizeof(short) + sizeof(int) + sizeof(int) + sizeof(char)。换句话说,您的结构中有垃圾,您不应该使用memcmp。

当然,memcmp是由于另一个原因不好,因为这意味着您的代码将是不可存储的,因为它的行为将取决于您平台的 endianess 。这本身就是足够的理由,不将memcMP用于此目的。