繁体   English   中英

为什么会出现细分错误? 瓦尔格朗德?

[英]Why am I getting a segmentation fault? Valgrind?

我编写了一个程序来确定两个字符串之间最长的公共子序列。 我已经用一个小的硬编码测试用例测试了我的函数LCSLength() ,它返回了正确的值。

现在,我正在从文件中读取字符串以进行比较,而我的程序却给我一个分段错误。 这是代码:

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;

int LCSLength(string X,string Y);

int main()
{
    ifstream inData("sequences.dat");
    vector<string> lines(1);
    string line;
    int LCS;

    while (getline(inData,line)) 
    {
        if (line.empty()) 
            lines.push_back("");
        else 
            lines.back() += line;
    }

    LCS = LCSLength(lines[0],lines[1]);
    cout << "The LCS is: " << LCS << endl;
    return 0;
}


int LCSLength(string X,string Y)
{
    int m = X.size();
    int n = Y.size();
    int L[m+1][n+1];
    for(int i=0; i<=m; i++)
    {
        for(int j=0; j<=n; j++)
        {
            if(i==0 || j==0)
                L[i][j] = 0;
            else if(X[i-1]==Y[j-1])
                L[i][j] = L[i-1][j-1]+1;
            else
                L[i][j] = max(L[i-1][j],L[i][j-1]);
        }
    }
    return L[m][n];
}

当我使用-pedantic -ansi进行编译时,出现以下错误:在函数LCSLength(std :: string,std :: string)中:ISO C ++禁止使用可变大小数组'L'。

我使用Valgrind进行编译,这是它产生的错误:

==15183== LEAK SUMMARY:
==15183==    definitely lost: 8,624 bytes in 14 blocks
==15183==    indirectly lost: 1,168 bytes in 5 blocks
==15183==      possibly lost: 5,518 bytes in 58 blocks
==15183==    still reachable: 44,925 bytes in 278 blocks
==15183==         suppressed: 0 bytes in 0 blocks
==15183== Reachable blocks (those to which a pointer was found) are not shown.
==15183== To see them, rerun with: --leak-check=full --show-reachable=yes
==15183== 
==15183== ERROR SUMMARY: 23 errors from 23 contexts (suppressed: 0 from 0)
==15183== 
==15183== 1 errors in context 1 of 23:
==15183== Invalid read of size 4
==15183==    at 0x38326: std::string::_Rep::_M_grab(std::allocator<char> const&, std::allocator<char> const&) (in /usr/lib/libstdc++.6.0.9.dylib)
==15183==    by 0x388EF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) (in /usr/lib/libstdc++.6.0.9.dylib)
==15183==    by 0x100001AAE: main (firstt.cpp:23)
==15183==  Address 0xfffffffffffffff8 is not stack'd, malloc'd or (recently) free'd
==15183== 
==15183== 
==15183== 1 errors in context 2 of 23:
==15183== Invalid read of size 8
==15183==    at 0x388DC: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) (in /usr/lib/libstdc++.6.0.9.dylib)
==15183==    by 0x100001AAE: main (firstt.cpp:23)
==15183==  Address 0x100023d28 is 0 bytes after a block of size 8 alloc'd
==15183==    at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==15183==    by 0x4B346: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib)
==15183==    by 0x100002DFE: __gnu_cxx::new_allocator<std::string>::allocate(unsigned long, void const*) (new_allocator.h:91)
==15183==    by 0x100002E42: std::_Vector_base<std::string, std::allocator<std::string> >::_M_allocate(unsigned long) (stl_vector.h:131)
==15183==    by 0x100002E9D: std::_Vector_base<std::string, std::allocator<std::string> >::_Vector_base(unsigned long, std::allocator<std::string> const&) (stl_vector.h:116)
==15183==    by 0x1000030E4: std::vector<std::string, std::allocator<std::string> >::vector(unsigned long, std::string const&, std::allocator<std::string> const&) (stl_vector.h:215)
==15183==    by 0x1000017D9: main (firstt.cpp:11)
==15183== 
==15183== ERROR SUMMARY: 23 errors from 23 contexts (suppressed: 0 from 0)
Segmentation fault: 11

我的测试文件有两行序列。 我检查lines.size()并返回2。我还cout << lines[0]cout << lines[1]并打印了正确的字符串。

谁能帮我解决这个问题? 谢谢。

您的lines向量始终包含一个元素,因此按索引1对其进行访问会导致UB

LCS = LCSLength(lines[0],lines[1]);
                          here ^  

您是否确认退出while循环后, lines[0] lines[1]lines[1]存在? 仅当您的输入文件中至少有一个空行(并且被这样识别)时,才会发生这种情况。

根据Valgrind(请阅读其输出!)-您在main (第11或23行)中而不是LCSLength

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM