Übung: Vector splice() - Heap beschädigt



  • Ich lerne im Moment C++ mit dem Buch: C++ lernen und professionell anwenden.
    Im Kapitel über Speicherreservierung gibt es die Aufgabe, eine Funkion zu schreiben, die einen Vektor in einen anderen an einer bestimmten Position einfügt.
    Die Funktion an sich macht keine Probleme, jedoch gibt es einen Laufzeitfehler, sobald man auf den (in der Funktion dynamisch erzeugten) Ergebnis-Vektor zugreift.

    Die Funktion:

    int* splice(int* vec1, short length1, int* vec2, short length2, short pos)
    {
    if(pos < 0 || pos > length1)  // Bei ungültiger Position abbrechen!
    	return NULL;
    
    int* hilf = new int[(length1 + length2)];  // int Vektor groß genug
    for(int i = 0; i < pos; i++)
    {
    	*(hilf + i) = *(vec1 + i);  // hilf = vec1 <- bis pos
    }
    for(int i = pos; i < (length2 + pos); i++)
    {
    	*(hilf + (pos + i)) = *(vec2 + i);  // hilf += vec2
    }
    for(int i = (pos + length2); i < (length1 + length2); i++)
    {
    	*(hilf + (pos + length2 + i)) = *(vec1 + (pos + i));  // Rest
    }
    	return hilf;
    }
    

    Eine einfache Benutzung wie:

    vec3 = splice(vec1, 10, vec2, 5, 3);
    if(vec3 == NULL)
    {
    	cout << "Ungueltige Position! Oder sonstwas..." << endl;
    	cin.clear(); cin.sync(); cin.get();  // Nich sofort Konsole schließen...
    	return 1;
    }
    for(int i = 0; i < 15; i++)
    {	
            cout << vec3[i] << tab;  // MÄP! Fehler :confused: ?
    }
    

    ...Erzeugt folgenden Laufzeitfehler:

    Unbehandelte Ausnahme bei 0x7740E753 (ntdll.dll) in splice.exe: 0xC0000374: Ein Heap wurde beschädigt (Parameter: 0x77444270)

    Auch wenn es wahrscheinlich ein Anfängerfehler ist, möchte ich dennoch wissen, was ich falschgemacht habe, um es in Zukunft zu vermeiden.

    MfG
    Sky 🙂



  • Skybuildhero schrieb:

    int* hilf = new int[(length1 + length2)];  // int Vektor groß genug
    for(int i = 0; i < pos; i++)
    {
    	*(hilf + i) = *(vec1 + i);  // hilf = vec1 <- bis pos
    }
    for(int i = pos; i < (length2 + pos); i++)
    {
    	*(hilf + (pos + i)) = *(vec2 + i);  // hilf += vec2
    }
    for(int i = (pos + length2); i < (length1 + length2); i++)
    {
    	*(hilf + (pos + length2 + i)) = *(vec1 + (pos + i));  // Rest
    }
    

    Deine Indices sind irgendwie nicht ganz ok.
    Z.B. in der zweiten Schleife:

    *(hilf + (pos + pos)) = *(vec2 + pos);
    // bis
    *(hilf + (pos + pos + length2 - 1)) = *(vec2 + pos + length2 - 1);
    

    Also entweder einfach zwei Indicies verwenden oder richtig verrechnen 😉



  • Danke!
    Ich hab alles durchsucht aber das wohl in meiner Frustration nach dem stundenlangen Suchen übersehen 😞 ...
    Ich wusste doch das es wieder so eine "Kleinichkeit" ist.
    Vielen Dank für die schnelle Antwort 😉


Anmelden zum Antworten