Woher weiß delete[] die Größe?



  • Hi!

    Wenn ich mit new[] neue Objekte anlege und die später mit delete[] wieder lösche - woher weiß delete[] dann, wie viele Objekte das sind?



  • Noch etwas genauer: Ich habe nur operator new und operator delete definiert, nicht die Array-Versionen new[] und delete[]. Der Compiler ruft für new[] new und für delete[] delete auf - erzeugt und löscht auch jeweils genau die richtige Menge Speicher.

    Compiler ist MSVC 9.0

    Und gleich noch eine Frage: Allgemein wird für operator new wohl __cdecl als Aufrufkonvention bevorzugt, hat das einen speziellen Grund?



  • http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.14 schrieb:

    [16.14] After p = new Fred[n], how does the compiler know there are n objects to be destructed during delete[] p?

    Short answer: Magic.

    Long answer: The run-time system stores the number of objects, n, somewhere where it can be retrieved if you only know the pointer, p. There are two popular techniques that do this. Both these techniques are in use by commercial-grade compilers, both have tradeoffs, and neither is perfect. These techniques are:

    • Over-allocate the array and put n just to the left of the first Fred object.
    • Use an associative array with p as the key and n as the value.

    Was das __cdecl hat, hab ich keine Idee. Es beschreibt ja nur in welcher Reihenfolge und wohin die Parameter einer Funktion übergeben werden und wer danach wieder aufräumt.



  • __cdecl ist, laut msdn, einfach die Standard Aufrufskonvention für C/C++.


Anmelden zum Antworten