Pointer Array auf dynamische angelegte Objekte releasen ?



  • Servus,

    entweder programmiere ich in einem unbekannten Stil oder aber die meisten Handbücher schweigen sich darüber aus... hilft wohl hoffentlich noch das gute C++ Forum, gg 🙂 Der Titel und Beispiel SourceCode sind Programm::

    #include <stdio.h>
    #include <stdlib.h>
    
    class Foo
    	{
    		public:
    			Foo() { }
    			Foo(int iQty) { iVariable=(int *)calloc(iQty,sizeof(int)); }
    			~Foo() { free(iVariable); iVariable=NULL; }
    
    			int *iVariable;
    	};
    
    int main()
    {
    	unsigned int ui;
    	class Foo **MyFoo=NULL;
    
    	(Foo **) MyFoo = (Foo **) new Foo[100]; // 100 Pointer auf Objekte von Foo, Zeile 19 !!
    	for(ui=0;ui<100;ui++) 
    		{
    			(Foo *) MyFoo[ui] = (Foo *) new Foo(1000); // 100 Objekte, aufruf des Konstruktor mit 1000
    		}
    
    	for(ui=0;ui<100;ui++)
    		{
    			delete MyFoo[ui]; // Löschen des ui.ten Objekts, aufruf des Destruktors
    			MyFoo[ui]=NULL;
    		}
    
    	delete MyFoo; // Löschen des Pointer Array's auf die Objekte
    
    	return 0;
    }
    

    Das Löschen des Pointer Array's auf die Objekte wird mir mit einer Schutzverletzung abgebrochen (Metrowerks), GNU G++ sagt die Deklaration, Definition sagt "main.cpp:line 19: error: non-lvalue in assignment" und der Intel Compiler schluckt es ausnahmslos...

    Was ist zu tun ? 😕

    Danke Winn



  • Deine Cast sind unnötig und nicht schön. in cpp sollte man ken c cast verwenden

    warum g++ nicht nimmt weiss ich leider nicht genau, aber ich glaube man darf leut stanart kein linken werte casten
    mfg



  • #include <cstdio> // <---
    #include <cstdlib> // <---
    
    class Foo
        {
            public:
                Foo() { }
                Foo(int iQty) { iVariable=(int *)calloc(iQty,sizeof(int)); }
                ~Foo() { free(iVariable); iVariable=NULL; }
    
                int *iVariable;
        };
    
    int main()
    {
        unsigned int ui;
        Foo **MyFoo=0;  // <---
    
        MyFoo =  new Foo*[100]; // <---
        for(ui=0;ui<100;ui++)
            {
                MyFoo[ui] = new Foo(1000); // <---
            }
    
        for(ui=0;ui<100;ui++)
            {
                delete MyFoo[ui];
                // MyFoo[ui]=NULL; // <---
            }
    
        delete[] MyFoo; // <---
    
        return 0;
    }
    

    p.s. wozu [m|c]alloc/free?



  • Merci 🙂 Hat geholfen... gibt es irgendwelche Vorteile wenn man statt calloc new verwendet ? Performance Vorteile ? Hab alles auf new umgestellt und ich hab das subjektive Empfinden, daß es einen Mini-Tick schneller wurde...

    Winn



  • Winn schrieb:

    Merci 🙂 Hat geholfen... gibt es irgendwelche Vorteile wenn man statt calloc new verwendet ?

    Ja, m/c/alloc ist C new ist C++

    Winn schrieb:

    Performance Vorteile ?

    Frag deinen Compiler, kann schon sein, dass er new "besser kann"



  • Hallo,

    ein entscheidender Unterschied zwischen new und malloc ist der, dass new noch den Konstruktor aufruft bzw. delete den Destruktor.



  • Und ein entscheidender Unterschied zu calloc, dass calloc alles mit 0 initialisiert.



  • Bashar schrieb:

    Und ein entscheidender Unterschied zu calloc, dass calloc alles mit 0 initialisiert.

    Grml, wohl wahr... in die Falle bin ich später auch noch getappt... mußte später überall noch Initialisierungs-Routinen einfügen 👎


Anmelden zum Antworten