Ruft new[] new auf?



  • Hallo,

    Ich habe mir den globalen operator new(size_t) überladen. Logischerweise wird der aufgerufen wenn ich schreibe:

    int* i = new int;
    

    Ich habe jedoch NICHT die Array Version (operator new[](size_t size)) überladen. Also ging ich davon aus, dass

    int* a = new int[5];
    

    nicht in meinen Code springt, sondern operator new[] meines Compilerherstellers benutzt. Zu meinem Erstaunen musste ich feststellen, dass mein operator new(size_t) aufgerufen wird! (mit size = 20).

    Ist das normal? Ruft operator new[] immer operator new auf? Wenn ja: Muss ich dann überhaupt noch extra operator new[] überschreiben, wenn ich operator new schon überschrieben habe?



  • AllohaEh schrieb:

    Ist das normal? Ruft operator new[] immer operator new auf? Wenn ja: Muss ich dann überhaupt noch extra operator new[] überschreiben, wenn ich operator new schon überschrieben habe?

    Nein - ob die Operatoren aufeinander aufbauen, ist im Standard afaik nicht festgelegt. Das heißt, es ist durchaus erlaubt, daß der operator new[] seine Daten von operator new holt - genausogut könnte jemand es genau umgekehrt machen oder beide Operatoren verwenden hinter den Kulissen eine gemeinsame alloc()-Funktion.



  • CStoll schrieb:

    AllohaEh schrieb:

    Ist das normal? Ruft operator new[] immer operator new auf? Wenn ja: Muss ich dann überhaupt noch extra operator new[] überschreiben, wenn ich operator new schon überschrieben habe?

    Nein - ob die Operatoren aufeinander aufbauen, ist im Standard afaik nicht festgelegt. Das heißt, es ist durchaus erlaubt, daß der operator new[] seine Daten von operator new holt - genausogut könnte jemand es genau umgekehrt machen oder beide Operatoren verwenden hinter den Kulissen eine gemeinsame alloc()-Funktion.

    Also besser operator new UND operator new[] überschreiben?



  • AllohaEh schrieb:

    Also besser operator new UND operator new[] überschreiben?

    Der Standard garantiert dir den Aufruf von new bei einem Aufruf von new[] nicht, also ja.


Anmelden zum Antworten