new[] - probleme beim reservieren von speicher auf dem heap



  • Hallo erstma bin neu hier...

    ich hab mir ne eigene klasse gebaut sowas ähnliches wie ein array hier:

    template<class t>
    class vector {
    	private:
    		int m_size;
    		t *m_data;
    	public:
    		vector(int size) {
    			m_size=size;
    			m_data=new t[m_size];
    		};
    		~vector() {
    			delete[] m_data;
    		};
    		t &operator[](int index) {
    			return m_data[index];
    		};
    		int getsize() {
    			return m_size;
    		};
    		void grow(int newsize) {
    			t *tmp=m_data;
    			delete[] m_data;
    			t *m_data=new t[newsize];
    			m_data=tmp;
    			m_size=newsize;
    			delete[] tmp;
    		};
    };
    

    da gibt es nur ein kleines problem wenn ich ich mit void grow die klasse erweitere bekomme ich nach dem beenden des programms noch sone hübsche fehlermeldung hinterhergeschoben:

    *** glibc detected *** ./cppkurs.run: double free or corruption (fasttop): 0x0804b008 ***
    ======= Backtrace: =========
    /lib/libc.so.6[0xb7de4911]
    /lib/libc.so.6(__libc_free+0x84)[0xb7de5f84]
    /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7f82e51]
    /usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0xb7f82ead]
    ./cppkurs.run[0x8048f24]
    ./cppkurs.run[0x8048e30]
    /lib/libc.so.6(__libc_start_main+0xdc)[0xb7d9687c]
    ./cppkurs.run(__gxx_personality_v0+0x51)[0x80487f1]
    ======= Memory map: ========
    08048000-0804a000 r-xp 00000000 08:07 163 /home/christoph/programmieren/cppkurs/cppkurs.run
    0804a000-0804b000 rw-p 00001000 08:07 163 /home/christoph/programmieren/cppkurs/cppkurs.run
    0804b000-0806c000 rw-p 0804b000 00:00 0 [heap]
    b7c00000-b7c21000 rw-p b7c00000 00:00 0
    b7c21000-b7d00000 ---p b7c21000 00:00 0
    [bla bla das geht noch etwas weiter ab will ich euch ersparen]
    b7fee000-b7ff0000 rw-p 00019000 08:06 14096 /lib/ld-2.4.so
    bfd97000-bfdac000 rw-p bfd97000 00:00 0 [stack]
    ffffe000-fffff000 ---p 00000000 00:00 0 [vdso]
    Abgebrochen

    wtf is das? das tritt nur auf wenn ich neuen speicher für die klasse reserviere
    ich meine beim programmablauf stört es nicht und ich kann auf die angelegten speicher zugreiffen und das programm läuft fehlerfrei aber dasis schon etwas unschön..

    wem der code irgendwie bekannt vorkommt is kein wunder is aus volkards cpp kurs Lektion 60 😉

    Edit: ach ja falls es eine rollen spielen sollte ich hab SuSE Linux 10.1 und benutze g++ als compiler... hoffe ihr könnt mir helfen



  • ਮয ફਥ঴એਮধ ટਯঙપ਩ল੼ਤচઌਦ঳ઌਦওખਨ঑બਯ঒ઓਬণધਬছધਦণભਪল છਥ঳੽ਯ঳੻ਮ঒ઠਥশઆਦঔતਤবફਮজઘਤধબਧ঵એਫঢએਮও੾ਨঞઠਭও઩ਭ঱੽਩঩ જਦস੽ਦসફਯষઞਥভધਫযઐ
    ਣ঒ ੿ਮঝઓਨঠ઀ਬ

    double free or corruption

    આਣতઐ਩ঘઋਣ঵ઈਫঝ ઍ਩পકਣত੽ਤঙ੽ਣ঑કਨওઐਤয ੾ਫকઔਧ঳ઊਣপફ਩ওઍਧগછਪডઢ਩঩ડਭ঴જਣ঑ફਤটઌਬঠ઒ਦতઆਤ঩ઑਧছથਦ঴ ભਯঢભਦড અਣষ દਯদંਧবઘਪক઎ਬঙ કਨছ ડਮঔઈਮফ તਭঢથ
    ਬগ પਤছ ੾ਮসછਣকઍ

    void grow(int newsize) {
           t *tmp=m_data;
           delete[] m_data;
    ...
           delete[] tmp;
    };
    


  • hä? wat? 😕

    griechisch? warum? kann ich leider nich lesen...

    P.S heisst das da "κμΘΔβς" zaziki?



  • noch mal ausführlicher erläutert was Alian From Mars bereits zeigte:

    void grow(int newsize) {
                t *tmp=m_data;
                delete[] m_data;
                t *m_data=new t[newsize];
                m_data=tmp;
                m_size=newsize;
                delete[] tmp;
            };
    

    überleg mal schritt für schritt was du da machst:
    du lässt tmp auf den alten speicherbereich zeigen und löscht ihn dann (womit tmp ungültig wird) legst dann neuen speicher an, den du allerdings in einen lokalen pointer speicherst, da du durch die neudeklaration das klasseneigene m_data verdeckst, dann biegst du den gerade neu belegten pointer auf den alten, ungültigen speicherbereich um und änderst size, wonach du dann erneut den ohnehin schon ungültigen speicher von tmp freigibst.
    hoffe habe mich in diesem wirr warr nicht zu sehr verirrt 🙄

    mfg.



  • ahhhh schmarrrn

    axo ja ich habs verstanden wie bekloppt... ich denke ich muss noch was üben...

    danke für die schnelle antwort...



  • jimmy pop schrieb:

    griechisch? warum?

    Griechisch? Das ist Indisch (zumindest die Schrift) ... die Frage nach dem Warum hingegen ist eine gute.



  • Naja, er wollte wohl damit sagen, dass man nicht wirklich was zu sagen braucht, da bereits alles in der Fehlermeldung steht. Bei einem Neuling wohl noch etwas zu viel verlangt.


Anmelden zum Antworten