C++ 向字符串向量赋值时出现cygwin异常

C++ 向字符串向量赋值时出现cygwin异常,c++,memory,cygwin,heap-memory,heap-corruption,C++,Memory,Cygwin,Heap Memory,Heap Corruption,在程序运行过程中,我遇到以下异常: 0 [main] myFunction 5560 cygwin_exception::open_stackdumpfile: Dumping stack trace to myFunction.exe.stackdump stackdump文件的内容如下: Stack trace: Frame Function Args 00000223800 0018006FB93 (0060007AE38, 00600083EC8, 0060008

在程序运行过程中,我遇到以下异常:

0 [main] myFunction 5560 cygwin_exception::open_stackdumpfile: Dumping stack trace to myFunction.exe.stackdump
stackdump文件的内容如下:

Stack trace:
Frame        Function    Args
00000223800  0018006FB93 (0060007AE38, 00600083EC8, 00600083EF8, 00600083F28)
00000000006  0018007105A (0060007BB78, 00600000000, 0000000014C, 00000000000)
000002239E0  0018011C6A7 (00600083048, 00600083078, 006000830A8, 006000830D8)
00000000041  001801198DE (0060007DCB8, 0060007DCE8, 00000000000, 0060007DD48)
0060008F2B0  00180119DAB (0060007E1F8, 0060007E228, 0060007E258, 00000000006)
0060008F2B0  00180119F7C (0060007CB38, 0060007CB68, 0060007CB98, 0060007CBC8)
0060008F2B0  0018011A23F (00180115A0B, 0060007CCE8, 006000885B0, 00000000000)
0060008F2B0  00180148A65 (003FC4AA93D, 00600083900, 00100439102, 0060007B080)
0060008F2B0  001800C1DB3 (00000000000, 00000223EE0, 0010042A2BC, 00000223E90)
0060008F2B0  00180115A0B (00000223EE0, 0010042A2BC, 00000223E90, 00000000017)
0060008F2B0  00600000001 (00000223EE0, 0010042A2BC, 00000223E90, 00000000017)
End of stack trace
TestClient client;
for(int j=0;j<27;j++){
std::cout<<j<<" "<<realTimeSymbols[j]<<" "<<getLocalSymbol(realTimeSymbols[j],date)<<std::endl;    
让我详细描述一下运行时发生的特殊问题。我无法用语言描述问题,所以我列出了程序运行和失败时的场景

我在头文件中创建了一个字符串向量,并在构造函数中对其进行了初始化,如下所示:

std::vector <std::string> symbolMap,localSymbolMap;

for(int i=0;i<100;i++){
    symbolMap.push_back(" ");
    localSymbolMap.push_back(" ");
}
void TestClient::setTickerMap(int j, std::string symbol, std::string localSymbol){

symbolMap[j] = symbol;
localSymbolMap[j]=localSymbol;
}
 symbolMap[j]="A";
现在,在主程序中,我调用此函数如下:

Stack trace:
Frame        Function    Args
00000223800  0018006FB93 (0060007AE38, 00600083EC8, 00600083EF8, 00600083F28)
00000000006  0018007105A (0060007BB78, 00600000000, 0000000014C, 00000000000)
000002239E0  0018011C6A7 (00600083048, 00600083078, 006000830A8, 006000830D8)
00000000041  001801198DE (0060007DCB8, 0060007DCE8, 00000000000, 0060007DD48)
0060008F2B0  00180119DAB (0060007E1F8, 0060007E228, 0060007E258, 00000000006)
0060008F2B0  00180119F7C (0060007CB38, 0060007CB68, 0060007CB98, 0060007CBC8)
0060008F2B0  0018011A23F (00180115A0B, 0060007CCE8, 006000885B0, 00000000000)
0060008F2B0  00180148A65 (003FC4AA93D, 00600083900, 00100439102, 0060007B080)
0060008F2B0  001800C1DB3 (00000000000, 00000223EE0, 0010042A2BC, 00000223E90)
0060008F2B0  00180115A0B (00000223EE0, 0010042A2BC, 00000223E90, 00000000017)
0060008F2B0  00600000001 (00000223EE0, 0010042A2BC, 00000223E90, 00000000017)
End of stack trace
TestClient client;
for(int j=0;j<27;j++){
std::cout<<j<<" "<<realTimeSymbols[j]<<" "<<getLocalSymbol(realTimeSymbols[j],date)<<std::endl;    
上述代码的以下3种变体解决方案不起作用,它们会导致原始错误:

变更1:

void TestClient ::setTickerMap(int j, std::string symbol, std::string localSymbol){
    if(j==24){
//      symbolMap[j]="SYNDIBANK";
//      localSymbolMap[j]="SYNDIBANK15MARFUT";
    }
    else{
    symbolMap[j] = symbol;
    localSymbolMap[j]=localSymbol;
    }
    if(j==25){
        symbolMap[24]="SYNDIBANK";
        localSymbolMap[24]="SYNDIBANK15MARFUT";
    }
}
变式2:

void TestClient ::setTickerMap(int j, std::string symbol, std::string localSymbol){
    if(j==24){
        symbolMap[j]="SYNDIBANK";
        localSymbolMap[j]="SYNDIBANK15MARFUT";
    }
    else{
    symbolMap[j] = symbol;
    localSymbolMap[j]=localSymbol;
    }
}
变式3:

void TestClient ::setTickerMap(int j, std::string symbol, std::string localSymbol){
    if(j==24){
        symbolMap[j]="AB";
        localSymbolMap[j]="SYNDIBANK15MARFUT";
    }
    else{
    symbolMap[j] = symbol;
    localSymbolMap[j]=localSymbol;
    }
}
现在,如果我在变体3中为symbolMap指定一个字符,如下所示:

std::vector <std::string> symbolMap,localSymbolMap;

for(int i=0;i<100;i++){
    symbolMap.push_back(" ");
    localSymbolMap.push_back(" ");
}
void TestClient::setTickerMap(int j, std::string symbol, std::string localSymbol){

symbolMap[j] = symbol;
localSymbolMap[j]=localSymbol;
}
 symbolMap[j]="A";
然后代码就可以运行了(尽管结果不正确)

我无法确定到底是什么导致了这个运行时错误。我已经检查了相关的问题(),并且没有单独运行cygwin会话。我已经重新启动了我的电脑,只是要特别确定。但问题依然存在。任何关于为什么在我的电脑上出现这种行为的建议

更新: 为确保错误与索引外无关,以下来自主程序的调用工作正常:

    TestClient client;
    for(int j=25;j<27;j++){
    std::cout<<j<<" "<<realTimeSymbols[j]<<" "<<getLocalSymbol(realTimeSymbols[j],date)<<std::endl;    
  client.setTickerMap(j,realTimeSymbols[j],getLocalSymbol(realTimeSymbols[j],date));
    }
TestClient;
对于(int j=25;j
您尚未发布
getLocalSymbol
的源代码,但我必须假设它也使用相同的数据,并且具有以下形式的流:

getLocalSymbol(a, b) {
    int i, j, old_i, old_j;
    std::string value;
    // Derive i and j from the parameters
    // ...
    // And build the String
    do {
            old_i = i;
            old_j = j;
            i = subscriptionList[old_i][old_j];
            j = subscriptionIndex[old_i][old_j];
            value += realTimeSymbolsArr[i];
    } while(j > 0);
    return value;
}
对吗?不管怎样,控制流或类似的东西似乎是它的一部分

这几乎适用于
i
j
的所有值,除了上述
i
24和
30
值,以及
i
1
3
值之外

有了这些值,
i
j
在每次迭代中都保持不变,
value
变得越来越长,直到最后堆栈上的某个东西断裂,覆盖了
j
(从而导致循环终止)并损坏

无论哪种方式,您返回的
std::string
现在已损坏,因为您在这个无休止的循环中超出了某些限制

至于如何解决这个问题,请修复无限循环并修复数据

要修复循环,请限制迭代次数

对于修复数据,现在您已经知道了数据导致错误的原因,您应该能够自己确定如何修复它


请记住,您必须同时修复这两个问题。
。如果不修复数据,您将获得不合理的长返回值。如果不修复迭代限制,当有人在更新数据时重复类似错误时,它将再次崩溃。

尝试在gdb中运行?这将帮助您确定程序崩溃的位置。尝试链接到标准库的索引检查版本,或将
[i]
替换为
.at(i)
,以查找可能的越界索引。@jsantander:我没有使用gdb,但我已使用printf和fflush(stdout)进行了检查,以确保在j等于24时以及在分配symbolMap[j]期间发生错误在setTickerMap函数内部。三屏代码,但我实际上无法编译任何代码来重现错误?发布的赏金禁止投票关闭,否则我会投票关闭。请将您的问题重新措辞为包含。准备这样一个最小的示例是一种由来已久的调试技术。您需要的是提供完整的对编译和崩溃的示例进行反采样。这意味着上面的main.cpp以及客户端类的简化版本。然后我们可以运行代码,调试代码,并轻松找到错误。