Meshloader macht Probleme



  • Bob Wolfskin schrieb:

    Die Frage ist warum folgendes verschiedene größen angibt.

    int _num = 3;
    Vertex* a = new Vertex[_num]; // das sind jetzt 3 Stück je 4 Bytes
    cout << sizeof(a) << endl; // Größe des Arrays
    cout << sizeof(Vertex) * 3 << endl; // Die richtige Größe jedoch größer als das Array
    

    Die Antwort ist:

    sizeof(a) == sizeof(Vertex*) // a ist ein Vertex*
    


  • Aber durch die Instanzierung werden doch 3 Elemente reserviert oder icht ?



  • Bob Wolfskin schrieb:

    Aber durch die Instanzierung werden doch 3 Elemente reserviert oder icht ?

    Ja, aber die Information über die Größe des Arrays ist nicht über 'a' zu erreichen.
    Die musst Du irgendwie mitschleppen.

    PS: Der Compiler ist Dir hier klar im Vorteil, weil der nämlich die Größe für delete [] a; wieder auslesen kann...


  • Mod

    Es gibt da so eine Klasse in der Standardbibliothek, die die Größe mitschleppt und sich automatisch um das new und delete kümmert....



  • Bob Wolfskin schrieb:

    Aber durch die Instanzierung werden doch 3 Elemente reserviert oder icht ?

    Dadurch wird der Pointer selber aber nicht größer. Nur der reservierte Speicher, auf den er zeigt.

    Makro? schrieb:

    Der Compiler ist Dir hier klar im Vorteil, weil der nämlich die Größe für delete [] a; wieder auslesen kann...

    Streng genommen ist das nicht der Compiler, aber ich hab heute schon genug Haare gespalten 😉

    SeppJ schrieb:

    Es gibt da so eine Klasse in der Standardbibliothek, die die Größe mitschleppt und sich automatisch um das new und delete kümmert....

    Kschsch. Du willst hier doch niemanden zu sauberem C++ verführen, oder?



  • pumuckl schrieb:

    Makro? schrieb:

    Der Compiler ist Dir hier klar im Vorteil, weil der nämlich die Größe für delete [] a; wieder auslesen kann...

    Streng genommen ist das nicht der Compiler, aber ich hab heute schon genug Haare gespalten 😉

    Fiel mir auch auf, aber:
    Ohne Registrierung keine Editierung...



  • Ich könnte das ganze auch folgenderweise machen:
    (Wird jedoch nicht auf dem Stack sondern auf dem Heap verbleiben)

    Vertex *v = (Vertex*)malloc(sizeof(*v));
    new (v) Vertex();  //oder so ähnlich
    

    Dabei wird direkt der Speicherbereich reserviert 😉
    Ist aber vollkommen unnötig


  • Mod

    Nenn mal einen einzigen Vorteil von malloc/placement new gegenüber "normalem" new und einen einzigen Vorteil von new genenüber std::vector.



  • SeppJ schrieb:

    Nenn mal einen einzigen Vorteil von malloc/placement new gegenüber "normalem" new

    Man kann reallozieren. 🙂


  • Mod

    Kellerautomat schrieb:

    SeppJ schrieb:

    Nenn mal einen einzigen Vorteil von malloc/placement new gegenüber "normalem" new

    Man kann reallozieren. 🙂

    Nicht, wenn du einen Konstruktor brauchtest, denn dann geht eine eventuelle Verschiebung schief.


Anmelden zum Antworten