[Gelöst] Operator new[] und delete[] in Templates



  • Hallo,

    ich habe eine generische Klasse, mit der ich Zeitmessungen für verschiedene Datentypen vornehme.

    Allerdings habe ich ein Problem mit dem new[]/delete[]-Operator.

    Deklariere ich einen generischen Pointer so, funktioniert der delete-Operator:

    T* varPointer = new T;
    delete varPointer;
    varPointer = NULL;
    

    Wende ich das ganze auf ein generisches Array an, funktioniert es nicht mehr und er stürzt beim Ausführen von delete[] ab:

    T* varArr = new T[length];
    delete[] varArr;
    varArr = NULL;
    

    Deklariere ich denselben Code mit einem festen Datentypen, funktioniert es wieder:

    int* debArr = new int[5];
    delete[] debArr;
    debArr = NULL;
    

    Wie muss ich den delete[]-Operator auf den generischen Datentypen anwenden oder ist dies gar nicht möglich?

    Viele Grüße,

    Tobias



  • Sir_Tobias schrieb:

    Wende ich das ganze auf ein generisches Array an, funktioniert es nicht mehr und er stürzt beim Ausführen von delete[] ab

    Dann hast Du irgendwo (anders) etwas falsch gemacht.

    Gibt es einen besonderen Grund, warum Du new[]/delete[] statt std::vector benutzen willst?

    Siehe auch
    http://drdobbs.com/blogs/cpp/229401975



  • Sir_Tobias schrieb:

    Wie muss ich den delete[]-Operator auf den generischen Datentypen anwenden oder ist dies gar nicht möglich?

    Es ist möglich, und zwar genau so wie du es hier angedeutet hast. Wo in deinem tatsächlichen Code der eigentliche Fehler liegt müsste sich rausfinden lassen. Dazu mach bitte folgendes:
    Reduziere deinen Code, indem du die folgenden Schritte mehrmals durchführst:

    - finde einen Codeteil, der für das Problem nicht relevant ist und kommentiere ihn aus.
    - Compiliere neu und stelle sicher, dass das Problem immernoch besteht. (Falls nicht, hast du die Problemstelle grade auskommentiert)

    Wenn du das so oft gemacht hast, dass nurnoch der Kern des Problems in möglichst wenig Code da ist (~20-50 Zeilen), dann stelle den Code mit den nötigen erklärenden Kommentaren versehen hier ins Forum, und wir können dir bestimmt weiterhelfen 🙂



  • Den Fehler habe ich gefunden.
    Ich hatte einen Verweis

    T* pointer = varArr;
    

    auf das Template-Array varArr, den ich allerdings zu früh gelöscht habe. Deshalb schlug das delete[] fehl, da das Objekt bereits nicht mehr existierte. Danke besonders an pumuckl für die Vorgehensweise. Die Reduzierung hat doch sehr geholfen.

    Ach so, die Verwendung von std::vector<T> ist mir bekannt, allerdings benötige ich Arrays von bestimmten Datenstrukturen zur Zeitmessung. Leider schluckt die Vector-Klasse und deren Operationen schon einiges an CPU-Time, so dass die Messungen leider ungenau werden.

    Vielen Dank nochmal für eure Hilfe.

    Gruß,

    Tobias


Anmelden zum Antworten