web-dev-qa-db-ja.com

basic_string :: _ M_construct nullは、文字列のサブベクトルを構築した後は無効です

私のコードはテキストファイルを読み取り、複数のスレッドが異なる行のチャンクを調べて最長の回文を探すことになっています。チャンクのサイズ(行数)は、引数として渡されるスレッドの可変数によって決まります。元のテキストファイルはstd :: vectorに格納され、ベクターの各インデックスは元のファイルに対応します。

サブベクトルチャンクをfindPalindome()に渡すと、「C++ basic_string :: _ M_construct null not valid」が返され、理由がわかりません。私の文字列はどれもNULLであってはなりません。

元のベクターラインを渡すときにエラーが発生しないため、サブベクターの作成方法に関係していると考えられます。

私のコードは次のとおりです。

Result longestPalindrome(std::string str)
{

    int maxLength = 1;  // The result (length of LPS)
    int start = 0;
    int len = str.size();
    int low, high;

    // One by one consider every character as center point of 
    // even and length palindromes
    for (int i = 1; i < len; ++i)
    {
        // Find the longest even length palindrome with center points
        // as i-1 and i.  
        low = i - 1;
        high = i;
        while (low >= 0 && high < len && str[low] == str[high])
        {
            if (high - low + 1 > maxLength)
            {
                start = low;
                maxLength = high - low + 1;
            }
            --low;
            ++high;
        }

        // Find the longest odd length palindrome with center 
        // point as i
        low = i - 1;
        high = i + 1;
        while (low >= 0 && high < len && str[low] == str[high])
        {
             if (high - low + 1 > maxLength)
             {
                start = low;
                maxLength = high - low + 1;
             }
             --low;
            ++high;
        }
    }
    Result result = {0, 0, 0};
    return result;
}

void findPalindome(std::vector<std::string> chunk, Result& result)
{
    Result localLargest = {0,0,0};
    for (unsigned int i = 0; i < chunk.size(); i++)
    {
        Result loopLargest = longestPalindrome(chunk[i]);
        if (localLargest < loopLargest)
        {
            localLargest = loopLargest;
        }
    }
    result = localLargest;
}

Result
FindPalindromeStatic(Lines const& lines, int numThreads)
{
    std::vector<Result> results(numThreads, {0,0,0});;
    int chunkSize = lines.size() / numThreads; //lines is the original vector with all the lines in the file
    std::vector<std::thread> threads;
    int counter = 0;
    for (int i = 0; i < numThreads; i++)
    {
        std::vector<std::string>::const_iterator begin = lines.begin() + counter;
        std::vector<std::string>::const_iterator end = lines.begin() + ((i + 1) * chunkSize);
        std::vector<std::string> chunk(begin, end);
        threads.emplace_back(&findPalindome, std::ref(chunk), std::ref(results[i]));
        counter = ((i+1)*chunkSize);
    }
    for (int i = 0; i < numThreads; i++)
    {
        threads[i].join();
    }
    Result x = {0,0,0};
    return x;
}

任意の助けをいただければ幸いであり、これは私の最初のスタックの質問なので、間違いをおかけして申し訳ありません。

12
schwingms

chunkベクトルは、forループ本体の最後に存在しなくなります。まだいくつかのスレッドによって参照されています。これはダングリングリファレンスと呼ばれ、非常に良くありません。

ただし、表示されるエラーはResultに関連している可能性があります。その定義を提供しない(または、この回答を書いた時点で定義を提供していなかった)ため、言うのは困難です。コードの何が問題なのかを尋ねている人は、何が重要であるかを表示しないかを決定する資格がないことを忘れないでください。

13