web-dev-qa-db-fra.com

basic_string :: _ M_construct null non valide après la construction du sous-vecteur de chaînes

Mon code est censé lire dans un fichier texte et avoir plusieurs threads à travers différents morceaux de lignes pour le palindrome le plus long. La taille du bloc (combien de lignes) est déterminée par un nombre variable de threads passés en argument. Le fichier texte d'origine est stocké dans un std :: vector où chaque index du vecteur correspond au fichier d'origine.

Lorsque je passe le bloc de sous-vecteur à findPalindome (), j'obtiens un 'C++ basic_string :: _ M_construct null non valide' et je ne peux pas comprendre pourquoi. Aucune de mes chaînes ne doit être NULL.

Lorsque je passe des lignes vectorielles originales, je n'ai aucune erreur, je suppose donc que cela a à voir avec la façon dont je crée le sous-vecteur.

Voici mon code:

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;
}

Toute aide serait appréciée et c'est ma première question de pile, donc désolé pour toute erreur.

12
schwingms

Le vecteur chunk cesse d'exister à la fin du corps de la boucle for. Il est toujours référencé par un fil. Cela s'appelle un référence pendant, et c'est très mauvais.

L'erreur que vous voyez peut cependant être liée à Result. Vous ne fournissez pas sa définition (ou vous ne l'aviez pas fournie au moment de la rédaction de cette réponse), c'est donc difficile à dire. N'oubliez pas que vous, en tant que celui qui demande ce qui ne va pas avec le code, n'êtes pas qualifié pour décider de ce qui est important ou ne pas montrer: si vous le saviez, vous sauriez probablement ce qui ne va pas.

13