c++ - 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 中填充地图
- 在功能 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==
解决方案
推荐阅读
- ios - 如何从 Date (2018-09-28 09:42:00 +0000 ) 中提取日期、月份和年份 (dd-MM-yyyy) 而没有日期格式的时间 - iOS swift?
- symfony - Symfony 4 - 登录后重定向用户没有活动
- python - numpy蒙面参差不齐的数组
- javascript - 组件道具在浅层渲染中未更新
- windows - Ngrok windows 自动启动
- sockets - 使用 CG-NAT 的两个设备之间的直接客户端-服务器连接
- react-native - 反应选择器下方的本机按钮
- c# - 具有惰性源/数据流的 TPL 数据流
- android - 顶部有 WMS 图层的地图(在线和离线) - Android
- azure - 如果我让它异步,我会破坏 Cosmos DB V1 触发器功能应用程序吗?