Ich versuche, die DLL zu testen, die ich mit GoogleTest schrieb und als ich einen der Tests rufen Sie werfen mir diesen Fehler:Debug-Assertion fehlgeschlagen! Expression: __acrt_first_block == Header
Ich bin zu dem Schluss gekommen, dass Das Problem liegt in der Zuweisung von Speicher zu Vektoren, aber ich weiß nicht, wie ich das lösen soll, da ich ziemlich neu in der C++ Programmierung bin. Der Code ist wie folgt:
#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;
}
Sie haben * undefiniertes Verhalten * in Ihrem Code. Sie haben eine leere Zeichenfolge im 'start2'-Vektor, die Sie schließlich an die' removeWhiteSpace'-Funktion übergeben, wo Sie auf das erste Zeichen der Zeichenfolgen im Vektor zugreifen. Wenn eine Zeichenfolge leer ist, enthält sie kein erstes Zeichen. Daher indexieren Sie außerhalb der Grenzen. Auch der Name 'removeWhiteSpace' ist nicht sehr gut, da die Funktion nicht wirklich Leerzeichen entfernt, sondern nur überprüft, ob das erste Zeichen einer Zeichenkette eine Ziffer ist oder nicht (falsch wie ich gerade bemerkt habe). –
@JoachimPilebog Der Vektor 'start2' wird hauptsächlich zum Debuggen des Vergleichsteils des Tests verwendet (der Teil des Codes, der nach dem Aufruf von' removeWhiteSpaces' steht) und wird entfernt, nachdem ich das Problem behoben habe. Auch die Funktion 'removeWhiteSpaces' entfernt tatsächlich den Leerraum, da nur die Elemente, die Ziffern sind, in einen neuen Vektor geschoben werden. – Rok
Btw. Warum kopierst du die Vektoren überall anstatt sie durch const zu übergeben (zum Beispiel in 'removeWhiteSpaces (std :: vector v, ...)' 'wo du nur auf den Vektor v schaust, also muss er nicht sein nicht-const). –
axalis