首页 > 解决方案 > C ++中的结构数据损坏

问题描述

我在访问第二个boost::unordered_map.

经过调查,我发现插入功能可能会搞砸的原因。

我有一个地图<std::string, struct securityId_symPosition>,其中在函数中创建了一个本地,struct s_securityId_symPosition并在 make_pair 函数的帮助下将它的副本插入到给定的地图中。

当我正在处理旧代码库时,我可以看到另一个不同结构的相同映射正在被填充并相应地使用,但是当给定映射用于使用第二个时,它会给出Segmentation fault.

我的实现方式的一个最小示例:

#include <boost/unordered_map.hpp>

struct test {
    int var1;
    char var2;
    bool var3;
    test():var1(0),var2('a'),var3(false){}
};

int main()
{
    typedef boost::unordered_map<int, test> map;
    map * nTest;

    nTest = new map();

    {
        for(int i = 0;i <=5; i++)
        {
            test t1;
            t1.var1 = i;
            nTest->insert(std::make_pair(i,t1));
        }
    }
    for(int i =0;i <=5; i++)
    {
        nTest->find(i)->second.var1; //this crashes
    }
}

我的程序工作流程:

  1. 在函数 1 中填充地图
  2. 在功能 2 中使用地图

注意:我没有从插入 1 到在 2 中找到地图

GDB 打印第二张地图:

IN FUNC1:
 stockName_ = {
    static npos = <optimized out>,
    _M_dataplus = {
      <std::allocator<char>> = {
        <__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
---Type <return> to continue, or q <return> to quit---
      members of std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider:
      _M_p = 0x7fffa40fb588 "ADANIPORTS27FEBFUT"
IdBuyLots_ = 0,
  IdBuyPrice_ = 0,
  IdSellLots_ = 0,
  IdSellPrice_ = 0,
  IdBuyQty_ = 0,
  IdSellQty_ = 0,
  IdBuyValue_ = 0,
  IdSellValue_ = 0,
  IntraDayCarriedLots_ = 0,
  IntraDayCarriedPrice_ = 0,
  IntraDayCarriedSpread_ = 0,
  IntraDayCarriedSpreadLots_ = 0,
  pBuyLots_ = 0,
  pBuyPrice_ = 0,
  pSellLots_ = 0,
  pSellPrice_ = 0,
  pBuyQty_ = 0,
  pSellQty_ = 0,
  pBuyValue_ = 0,
  pSellValue_ = 0,
  pCarriedLots_ = 0,
  pCarriedPrice_ = 0,
  pCarriedSpread_ = 0,
  pCarriedSpreadLots_ = 0,
  avgPrice_ = 0,
  TotalLotstobeCarried_ = 0,
  DiscountedavgPrice_ = 0,
  avgCarriedspread_ = 0,
  avgCarriedspreadLots_ = 0,
  avgCarriedspreadDiscounted_ = 0,
  numofDays_ = 1,
  availableLots_ = 0,
  Positional_Lots_To_Exit_ = 0,
  closePrice_ = 0


In Func2:
  stockName_ = {
    static npos = <optimized out>,
    _M_dataplus = {
      <std::allocator<char>> = {
        <__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
---Type <return> to continue, or q <return> to quit---
      members of std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider:
      _M_p = 0x7fffa40fb468 "NSECM,15083,ADANIPORTS,20200227,ADANIPORTS,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"
    }

  IdBuyLots_ = 140737267093296,
  IdBuyPrice_ = 2.9643938750474793e-323,
  IdSellLots_ = 0,
  IdSellPrice_ = 2.0246810166574283e-320,
  IdBuyQty_ = 140733193388034,
  IdSellQty_ = 0,
  IdBuyValue_ = 0,
  IdSellValue_ = 0,
  IntraDayCarriedLots_ = 0,
  IntraDayCarriedPrice_ = 0,
  IntraDayCarriedSpread_ = 0,
  IntraDayCarriedSpreadLots_ = 0,
  pBuyLots_ = 0,
  pBuyPrice_ = 0,
  pSellLots_ = 0,
  pSellPrice_ = 0,
  pBuyQty_ = 0,
  pSellQty_ = 0,
  pBuyValue_ = 0,
  pSellValue_ = 0,
  pCarriedLots_ = 0,
  pCarriedPrice_ = 0,
  pCarriedSpread_ = 0,
  pCarriedSpreadLots_ = 0,
  avgPrice_ = 6.953143608256303e-310,
  TotalLotstobeCarried_ = 140736513561544,
  DiscountedavgPrice_ = 6.9533448814870815e-310,
  avgCarriedspread_ = 0,
  avgCarriedspreadLots_ = 140736486047744,
  avgCarriedspreadDiscounted_ = 6.9533076466158444e-310,
  numofDays_ = -221152928,
  availableLots_ = 140737267202288,
  Positional_Lots_To_Exit_ = 140737267202304,
  closePrice_ = 140737267109048

我看到的地图有效和无效的唯一区别是,另一个相对较大,所以;这会是个问题吗?

瓦尔格林唱片

9563 ==8228== 672 bytes in 2 blocks are possibly lost in loss record 108,795 of 112,718
9564 ==8228==    at 0x15894203: operator new(unsigned long) (vg_replace_malloc.c:334)
9565 ==8228==    by 0x75D7F434: __gnu_cxx::new_allocator<boost::unordered::detail::ptr_node<std::pair<std::string const, SBA::Bidding::securityId_symPosition> > >:: 
     allocate(unsigned long, void const*) (new_allocator.h:104)
9566 ==8228==    by 0x75D7DC89: boost::unordered::detail::allocator_traits<std::allocator<boost::unordered::detail::ptr_node<std::pair<std::string const, SBA::      
     Bidding::securityId_symPosition> > > >::allocate(std::allocator<boost::unordered::detail::ptr_node<std::pair<std::string const, SBA::Bidding::                  
     securityId_symPosition> > >&, unsigned long) (allocate.hpp:546)
9567 ==8228==    by 0x75D7B4CC: boost::unordered::detail::node_constructor<std::allocator<boost::unordered::detail::ptr_node<std::pair<std::string const, SBA::      
     Bidding::securityId_symPosition> > > >::construct() (buckets.hpp:407)
9568 ==8228==    by 0x75D7840E: void boost::unordered::detail::node_constructor<std::allocator<boost::unordered::detail::ptr_node<std::pair<std::string const, SBA:: 
     Bidding::securityId_symPosition> > > >::construct_with_value<std::string&, SBA::Bidding::securityId_symPosition&>(std::string&, SBA::Bidding::                  
     securityId_symPosition&) (buckets.hpp:347)
9569 ==8228==    by 0x75D74971: std::pair<boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<std::string const, SBA::Bidding:: 
     securityId_symPosition> > >, bool> boost::unordered::detail::table_impl<boost::unordered::detail::map<std::allocator<std::pair<std::string const, SBA::Bidding::
     securityId_symPosition> >, std::string, SBA::Bidding::securityId_symPosition, boost::hash<std::string>, std::equal_to<std::string> > >::emplace_impl<std::      
     string&, SBA::Bidding::securityId_symPosition&>(std::string const&, std::string&, SBA::Bidding::securityId_symPosition&) (unique.hpp:409)
9570 ==8228==    by 0x75D71205: std::pair<boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<std::string const, SBA::Bidding:: 
     securityId_symPosition> > >, bool> boost::unordered::detail::table_impl<boost::unordered::detail::map<std::allocator<std::pair<std::string const, SBA::Bidding::
     securityId_symPosition> >, std::string, SBA::Bidding::securityId_symPosition, boost::hash<std::string>, std::equal_to<std::string> > >::emplace<std::string&,   
     SBA::Bidding::securityId_symPosition&>(std::string&, SBA::Bidding::securityId_symPosition&) (unique.hpp:380)
9571 ==8228==    by 0x75D6EA74: std::pair<boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<std::string const, SBA::Bidding:: 
     securityId_symPosition> > >, bool> boost::unordered::unordered_map<std::string, SBA::Bidding::securityId_symPosition, boost::hash<std::string>, std::           
     equal_to<std::string>, std::allocator<std::pair<std::string const, SBA::Bidding::securityId_symPosition> > >::emplace<std::string&, SBA::Bidding::              
     securityId_symPosition&>(std::string&, SBA::Bidding::securityId_symPosition&) (unordered_map.hpp:238)
9572 ==8228==    by 0x75D53CF6: SBA::Bidding::P_init(char const*) (cashfut_trade.cpp:732)
9573 ==8228==    by 0x75D4C6B5: SBA::Bidding::Bidding(API2::StrategyParameters*) (cashfut_trade.cpp:125)
9574 ==8228==    by 0x75D629D2: SBA::Bidding::bidDriver(void*) (cashfut_trade.cpp:2179)
9575 ==8228==    by 0x75D3E263: getDriver (externalInterface.cpp:16)
9576 ==8228==

标签: c++boostsegmentation-fault

解决方案


推荐阅读