Debug Assertion Failed! Expression: __acrt__bloc == en-tête

Je suis en train de tester la dll que j'ai écrit avec GoogleTest et quand j'ai appeler l'un de ces tests, Il me lance ce message d'erreur:

Debug Assertion Failed! Expression: __acrt__bloc == en-tête

Je suis venu à la conclusion que le problème est dans l'attribution de la mémoire à des vecteurs mais je ne sais pas comment résoudre ce que je suis assez nouveau à la programmation en C++. Le code est comme suit:

#ArraysCPP11.h
#ifdef ARRAYSCP11_EXPORTS
#define ARRAYSCP11_API __declspec(dllexport)
#else
#define ARRAYSCP11_API __declspec(dllimport)
#endif

__declspec(dllexport) void removeWhiteSpaces(std::vector<std::string> v, std::vector<std::string> &output);
#ArraysCPP11.cpp
void removeWhiteSpaces(std::vector<std::string> v, std::vector<std::string> &output) { //odstranjevanje presledkov iz vector-ja (vsak drugi element je bil presledek)
    for (std::vector<std::string>::iterator it = v.begin(); it != v.end(); it++) {
        std::string buffer = *it;
        if (isdigit(buffer[0])){;
            output.push_back(*it);
        }
    }
}
#TestTemp.h

template<class T> 
class TestTemp
{
public:
   TestTemp();
   void SetValue(T obj_i);
   T GetValue();
   bool alwaysTrue();
   bool TestTemp<T>::formattingTest(std::string input, std::vector<std::string> realVector, std::vector<std::string> formattedInput);
private:
   T m_Obj;
};

template<class T>
inline bool TestTemp<T>::formattingTest(std::string input, std::vector<std::string> realVector, std::vector<std::string> formattedVector) {
std::string input2 = input;
// std::vector<std::string> fResult;
std::string first;
std::string second;
bool endResult = true;
std::vector<std::string> end;
//std::vector<std::string> result = split(input2, ' ');
removeWhiteSpaces(formattedVector,end);
std::vector<std::string>::iterator yt = realVector.begin();
for (std::vector<std::string>::iterator it = end.begin(); it != end.end(); it++, yt++) {
    first = *it;
    second = *yt;
    if (first.compare(second) != 0) {
        endResult = false;
        break;
    }
}
return endResult;
}
   #ArraysCPP11-UnitTest.cpp
struct formattingTesting{
//  formattingTesting* test;
std::string start;
std::vector<std::string> endResult;
formattingTesting() {
}
explicit formattingTesting(const std::string start, const std::vector<std::string> endResult)
: start{start}, endResult{endResult} 
{
}
};
struct fTest : testing::Test {
formattingTesting* test;
fTest() {
test = new formattingTesting;
}
~fTest() {
delete test;
}
};
struct format {
std::string start;
std::vector<std::string> end;
};
struct formTest : fTest, testing::WithParamInterface<format> {
formTest() {
test->start = GetParam().start;
test->endResult = GetParam().end;
}
};
TEST_P(formTest, test1) {
bool endResult = true;
TestTemp<int> TempObj;
std::string first;
std::string second;
//std::string start ("1  2 3 4 5 6 7 8 9 10");
//std::vector<std::string> end = { "1","2","3","4","5","6","7","8","9","10" };
std::vector<std::string> start2 = { "1","","2","3","4","5","6","7","8","9","10" };
std::string start = GetParam().start;
std::vector<std::string> end = GetParam().end;
bool result = TempObj.formattingTest(start,end,start2);      
EXPECT_TRUE(result);
}
INSTANTIATE_TEST_CASE_P(Default, formTest, testing::Values(
format{ "1", {"1"} },
format{ " ", {} },
format{ "1 2 3 4 5",{"1","2","3","4","5"} },
format{ "1  2 3 4 5  6", {"1","2","3","4","5","6"} }
));
int main(int argc, char** argv)
{
testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();
return 0;
}
Vous avez undefined behavior dans votre code. Vous avez une chaîne vide dans le start2 vecteur, que vous passer à la removeWhiteSpace fonction, d'où vous avez accès au premier caractère de la chaînes dans le vecteur. Si une chaîne est vide, il n'a pas un premier caractère, si vous êtes d'indexation en dehors des limites. Aussi le nom removeWhiteSpace n'est pas très bonne, comme la fonction n'est pas réellement supprimer les espaces blancs, il vérifie juste si le premier caractère d'une chaîne est un chiffre ou pas (à tort, comme je viens de le remarquer).
le vecteur start2 est principalement utilisé pour le débogage de la comparaison de la partie de l'épreuve (la partie du code qui est, après l'appel des removeWhiteSpaces) et sera supprimée après j'ai corrigé le problème. Aussi la fonction removeWhiteSpaces en fait de supprimer l'espace blanc car il pousse uniquement les éléments qui sont des chiffres dans un nouveau vecteur
Btw. pourquoi avez-vous copier les vecteurs partout au lieu de les passer par référence const (par exemple dans removeWhiteSpaces(std::vector<std::string> v, ...) où vous regardez seulement le vecteur v de sorte qu'il n'a pas besoin d'être non-const).
Bien faire des commentaires sur votre exemple de ce que je comprends (je suis très débutant en C++) j'ai fait la fonction de travail de sorte que le vecteur v est une entrée et la fonction repousse les valeurs qui sont des chiffres dans le vecteur output. Je sais qu'il y a probablement une meilleure façon de traiter avec cela, mais je n'ai pas vraiment trouvé une, si tout conseil serait grandement apprécié
Le point est que vous pouvez utiliser void removeWhiteSpaces(const std::vector<std::string> & v, std::vector<std::string> &output); de ne pas copier le premier vecteur, et l'utilisation std::vector<std::string>::const_iterator au lieu de std::vector<std::string>::iterator à l'intérieur). Similaires pour d'autres fonctions avec des paramètres d'entrée qui n'ont pas besoin d'être modifié à l'intérieur.

OriginalL'auteur Rok | 2016-02-10