delete[]



  • Hallo,
    wenn man einen dynamisch erstellten Array wieder freigeben will, gibt man ja keine Größe an. Der Compiler oder das OS müssen also selber wissen, wie viele Elemente vorhanden sind. Google sagt mir, dass zusätzlich zum Array-Inhalt noch eine size_t-Variable mit der Größe gespeichert wird.
    Wenn dem so ist, gibt es dann nicht auch eine Möglichkeit, die Größe eines dynamischen Arrays herauszufinden?

    template <typename T>
    size_t dynarr_size(T* a)
    {
    	// ?
    }
    
    int main()
    {
    	int *p = new int[20];
    	cout << dynarr_size(p) << endl;
    	return 0;
    }
    


  • Hallo,
    ja, es gibt eine Möglichkeit:

    #include <iostream>
    #include <Windows.h>
    
    int main() 
    { 
        int *p = new int[20]; 
    
    	std::cout<< ( ::_msize( reinterpret_cast< void * > ( p ) ) / sizeof( *p ) ) <<std::endl;
    
        return 0; 
    }
    

    Allerdings solltest du das nicht tun, da diese Funktion nicht für so etwas vorhergesehen ist. Außerdem ist sie Windowsspezifisch.

    Da du dich hier in der C++-Abteilung aufhältst würde ich dir eher zu STL-Containern raten.

    Die dritte Lösung wäre eine Struktur, die das Array selber und die Anzahl der Elemente festhält.



  • Wurstinator schrieb:

    Hallo,
    wenn man einen dynamisch erstellten Array wieder freigeben will, gibt man ja keine Größe an. Der Compiler oder das OS müssen also selber wissen, wie viele Elemente vorhanden sind. Google sagt mir, dass zusätzlich zum Array-Inhalt noch eine size_t-Variable mit der Größe gespeichert wird.

    Ja, vereinfachend gesagt.

    Wurstinator schrieb:

    Wenn dem so ist, gibt es dann nicht auch eine Möglichkeit, die Größe eines dynamischen Arrays herauszufinden?

    Nein.
    Wie lange Kóyaánasqatsis dunkler Hack funktioniert, steht in den Sternen.

    Denn der Compiler darf optimieren.
    Vielleicht speichert er an genannter Stelle nur einen Zeiger auf denjenigen Small Object Allocator, der für diesen Block zuständig war, bzw nullptr für den Großen. Das reicht für genaues Freigeben. Für Destruktoraufrufe muß er zusätzlich noch die genau Anzahl wissen. Aber nur, wenn es nicht PODs sind. Für dieses int-Array wäre Sense. Auch könnte optimiert werden, daß wenn new[] und delete[] in der selben Funktion stehen und keine andere mit dem Zeiger aufgerufen wird, die Größe nicht gespeicher wird, da sie dem Compiler eh bekannt ist. Es könnte auch für jede Art zu deletendem Block mit compilezeitkonstanter Größe eine eigene optimierte Funktion angelegt werden und dort nur dieser Funktionszeiger gespeichert wird.
    Ok, alles recht unwahrscheinlich. Aber früher oder später wird sowas geschehen und der dunkle Hack wird abgestraft.



  • volkard schrieb:

    Wie lange Kóyaánasqatsis dunkler Hack funktioniert, steht in den Sternen.

    Das du mich immer so fertig machen musst... 😞
    🤡



  • Wie lange Kóyaánasqatsis dunkler Hack funktioniert, steht in den Sternen.

    Okay, also ist nicht festgelegt, wie das gespeichert werden muss?
    Danke.

    Da du dich hier in der C++-Abteilung aufhältst würde ich dir eher zu STL-Containern raten.

    Ich weiß, habs nur aus Interesse gefragt 🙂



  • Kóyaánasqatsi schrieb:

    volkard schrieb:

    Wie lange Kóyaánasqatsis dunkler Hack funktioniert, steht in den Sternen.

    Das du mich immer so fertig machen musst... 😞
    🤡

    Du bist jetzt mächtig stolz darauf dass du weisst wie MSVC das macht, und wie man daher mit einem dreckigen Hack an die Grösse drankommen kann. Und jetzt musst du dieses Wissen, auf das du ja so stolz bist, natürlich in die Welt hinausschreien.
    Verständlich.
    Aber sehr lästig, da du damit vermutlich mehr schadest als du hilfst.

    Ein einfacher Hinweis ala "ja, der Compiler speichert die Grösse irgendwo ab, es gibt aber keinen standardisierten Weg da dranzukommen" wäre viel hilfreicher gewesen.



  • Also ein bisschen Fertig bist du ja schon.



  • Weil?


  • Administrator

    Und so am Rande: Wozu der reinterpret_cast<void*> ?

    Grüssli



  • Dravere schrieb:

    Und so am Rande: Wozu der reinterpret_cast<void*> ?

    Grüssli

    Sieht magischer aus.



  • Ja, ich kann nicht proggen. Ihr habt mich ertappt 😞



  • hustbaer schrieb:

    Weil?

    Das wissen der welt nicht nur für dich zugängig ist. Jemand fragt etwas, jemand bekommt eine antwort. Wieso maßt du dir an entscheiden zu können was(wieviel wissen) für diese person die richtige Antwort ist? Es wurde sogar drauf hin gewiesen, dass das ne dumme idee ist, es so zu machen. Aber wieso darf man sowas nicht wissen? Überheblichkeitsdenken, da man es selber ja weiss?


Anmelden zum Antworten