Implementierung eines dynamischen Arrays ohne die STL



  • Hallo @ll,

    ich muss für die Uni eine eigene vector Klasse implementieren, ohne dabei auf die STL zurück zu greifen. Iteratoren fallen dabei weg. Ich habe jedoch bei der resize() Funktion ein Problem. Diese wird aufgerufen, sobald der interne Puffer (T* buffer) in seiner Kapazität überschritten wird.

    template <class T>
    void vector<T>::resize()
    {
        auto tmp = new T[bufferSize * 2];
        memcpy(tmp, buffer, bufferSize * sizeof(T));
        delete[] buffer;
        buffer = tmp;
        bufferSize *= 2;
    }
    

    Bei dieser Funktion bekomme ich beim delete[] Statement eine "Heap corruption detected after normal block. CRT detected that the application wrote to memory after end of heap buffer".

    Was mache ich falsch?

    Die relevanten Konstruktoren sehen so aus:

    template <class T>
    vector<T>::vector() : vector(4)
    {    
    }
    
    template <class T>
    vector<T>::vector(int initialSize)
    {
        if (initialSize <= 0)
            initialSize = 4;
    
        index = 0;    
        buffer = new T[initialSize];
        bufferSize = initialSize;
    }
    

  • Mod

    Code4Fun schrieb:

    Was mache ich falsch?

    Wissen wir nicht. Die Fehlermeldung deutet darauf hin, dass dass du irgenwann vor dem delete auf Speicher hinter dem reservierten Block (schreibend) zugegriffen hast. Das kann im Prinzip alles sein, naheliegend wäre ein Zugriff über einen ungültigen Index.



  • Du hast noch andere Probleme im Code:
    1. mit new T[n] erzeugst du n Objekte von T. Wo ist der Code bzgl. Kapazität? Resize mache zumindest bei std::vector was anderes als reserve.
    2. memcpy. Das mag bei Zahlen gehen. Aber auf jeden Fall nicht allgemein! Nimm an, dass du irgendelche Objekte speicherst, das irgendwo einen Pointer auf sich selbst hat. Wenn du das nun anderswo hinkopierst, geht der Pointer kaputt. D.h. eigentlich möchtest du doch den move-Konstruktor aufrufen.


Anmelden zum Antworten