Arrays



  • dies ist eine klasse fuer den einfacheren umgang mit Arrays.

    template<class C>class Array{
        public:
          C*_;
          int length;
          Array(){
            _=0;
            length=0;
          }
          Array(int dlength){
            _[dlength];
            length=dlength;
          }
          Array(C d_[]){
            _=d_;
            length=sizeof(d_)/sizeof(C);
          }
          ~Array(){
            delete[]_;
          }
          void add(C a){
            cout<<"adding"<<endl;
            C c[length+1];
            for(int i=0;i<length;i++)
              c[i]=_[i];
            c[length++]=a;
            //delete[]_;
            _=c;
          }
          void entf(C a){
            for(int i=0;i<length;i++){
              if(_[i]==a)
                del(i);
            }
          }
          void del(int d){
            C c[length-1];
            for(int i=0;i<d;i++){
              c[i]=_[i];
            }
            for(int i=d;i<length-1;i++){
              c[i]=field(i+1);
            }
            _=c;
            length--;
          }
    
          C operator[](int i){
            return*(_+i);
          }
          C&field(int i){
            return *(_+i);
          }
      };
    

    Jedoch funktoiniert die Funktion add() nicht. Ist hier bereits der Fehler erkennbar oder liegt das an den Objekten die ich uebergebe?

    (nach abschluss der add()-Funktion kommt die Fehlermeldung:
    *** Error in `./game1': double free or corruption (out): 0x00007fff136f2710 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x80a46)[0x7f87b011da46]
    ./game1[0x401f03]
    ./game1[0x401a1e]
    ./game1[0x401b61]
    ./game1[0x401d74]
    ./game1[0x4022b9]
    ./game1[0x401e49]
    ./game1[0x401881]
    ./game1[0x40166e]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f87b00beea5]
    ./game1[0x4011e9]
    ======= Memory map: ========
    00400000-00403000 r-xp 00000000 08:05 524426 /home/fabio/Programme/Eigen/Games/Game1/game1
    00602000-00603000 r--p 00002000 08:05 524426 /home/fabio/Programme/Eigen/Games/Game1/game1
    00603000-00604000 rw-p 00003000 08:05 524426 /home/fabio/Programme/Eigen/Games/Game1/game1
    012db000-01759000 rw-p 00000000 00:00 0 [heap]
    7f87a854e000-7f87a948e000 rw-p 00000000 00:00 0
    7f87a948e000-7f87a94c0000 r-xp 00000000 08:05 1056467 /usr/lib/x86_64-linux-gnu/libtxc_dxtn_s2tc.so.0.0.0
    7f87a94c0000-7f87a96bf000 ---p 00032000 08:05 1056467 /usr/lib/x86_64-linux-gnu/libtxc_dxtn_s2tc.so.0.0.0
    7f87a96bf000-7f87a96c0000 r--p 00031000 08:05 1056467 /usr/lib/x86_64-linux-gnu/libtxc_dxtn_s2tc.so.0.0.0
    7f87a96c0000-7f87a96c1000 rw-p 00032000 08:05 1056467 /usr/lib/x86_64-linux-gnu/libtxc_dxtn_s2tc.so.0.0.0
    7f87a96c1000-7f87a96c9000 r-xp 00000000 08:05 1056660 /usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1
    7f87a96c9000-7f87a98c8000 ---p 00008000 08:05 1056660 /usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1
    7f87a98c8000-7f87a98c9000 r--p 00007000 08:05 1056660 /usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1
    7f87a98c9000-7f87a98ca000 rw-p 00008000 08:05 1056660 /usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1
    7f87a98ca000-7f87a98ea000 r-xp 00000000 08:05 1048865 /usr/lib/x86_64-linux-gnu/libdrm_intel.so.1.0.0
    7f87a98ea000-7f87a9ae9000 ---p 00020000 08:05 1048865 /usr/lib/x86_64-linux-gnu/libdrm_intel.so.1.0.0
    7f87a9ae9000-7f87a9aea000 r--p 0001f000 08:05 1048865 /usr/lib/x86_64-linux-gnu/libdrm_intel.so.1.0.0
    7f87a9aea000-7f87a9aeb000 rw-p 00020000 08:05 1048865 /usr/lib/x86_64-linux-gnu/libdrm_intel.so.1.0.0
    7f87a9aeb000-7f87a9b11000 r-xp 00000000 08:05 4063335 /lib/x86_64-linux-gnu/libexpat.so.1.6.0
    7f87a9b11000-7f87a9d11000 ---p 00026000 08:05 4063335 /lib/x86_64-linux-gnu/libexpat.so.1.6.0
    7f87a9d11000-7f87a9d13000 r--p 00026000 08:05 4063335 /lib/x86_64-linux-gnu/libexpat.so.1.6.0
    7f87a9d13000-7f87a9d14000 rw-p 00028000 08:05 4063335 /lib/x86_64-linux-gnu/libexpat.so.1.6.0
    7f87a9d14000-7f87aa0b2000 r-xp 00000000 08:05 1050485 /usr/lib/x86_64-linux-gnu/libdricore9.1.3.so.1.0.0
    7f87aa0b2000-7f87aa2b2000 ---p 0039e000 08:05 1050485 /usr/lib/x86_64-linux-gnu/libdricore9.1.3.so.1.0.0
    7f87aa2b2000-7f87aa2c3000 r--p 0039e000 08:05 1050485 /usr/lib/x86_64-linux-gnu/libdricore9.1.3.so.1.0.0
    7f87aa2c3000-7f87aa2cd000 rw-p 003af000 08:05 1050485 /usr/lib/x86_64-linux-gnu/libdricore9.1.3.so.1.0.0
    7f87aa2cd000-7f87aa2e4000 rw-p 00000000 00:00 0
    7f87aa2e4000-7f87aa3a1000 r-xp 00000000 08:05 1447029 /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
    7f87aa3a1000-7f87aa5a1000 ---p 000bd000 08:05 1447029 /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
    7f87aa5a1000-7f87aa5a4000 r--p 000bd000 08:05 1447029 /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
    7f87aa5a4000-7f87aa5a6000 rw-p 000c0000 08:05 1447029 /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
    7f87aa5a6000-7f87aa5a7000 rw-p 00000000 00:00 0
    7f87aa5a7000-7f87aa5b0000 r-xp 00000000 08:05 1050445 /usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0
    7f87aa5b0000-7f87aa7af000 ---p 00009000 08:05 1050445 /usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0
    7f87aa7af000-7f87aa7b0000 r--p 00008000 08:05 1050445 /usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0
    7f87aa7b0000-7f87aa7b1000 rw-p 00009000 08:05 1050445 /usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0
    7f87aa7b1000-7f87aa7ba000 r-xp 00000000 08:05 1050441 /usr/lib/x86_64-linux-gnu/libXcursor.so.1.0.2
    7f87aa7ba000-7f87aa9ba000 ---p 00009000 08:05 1050441 /usr/lib/x86_64-linux-gnu/libXcursor.so.1.0.2
    7f87aa9ba000-7f87aa9bb000 r--p 00009000 08:05 1050441 /usr/lib/x86_64-linux-gnu/libXcursor.so.1.0.2
    7f87aa9bb000-7f87aa9bc000 rw-p 0000a000 08:05 1050441 /usr/lib/x86_64-linux-gnu/libXcursor.so.1.0.2
    7f87aa9bc000-7f87aadfa000 r--p 00000000 08:05 1048748 /usr/lib/locale/locale-archive
    7f87aadfa000-7f87aae10000 r-xp 00000000 08:05 4068970 /lib/x86_64-linux-gnu/libresolv-2.17.so
    7f87aae10000-7f87ab010000 ---p 00016000 08:05 4068970 /lib/x86_64-linux-gnu/libresolv-2.17.so
    7f87ab010000-7f87ab011000 r--p 00016000 08:05 4068970 /lib/x86_64-linux-gnu/libresolv-2.17.so
    7f87ab011000-7f87ab012000 rw-p 00017000 08:05 4068970 /lib/x86_64-linux-gnu/libresolv-2.17.so
    7f87ab012000-7f87ab014000 rw-p 00000000 00:00 0
    7f87ab014000-7f87ab01a000 r-xp 00000000 08:05 1056628 /usr/lib/x86_64-linux-gnu/libogg.so.0.8.0
    7f87ab01a000-7f87ab219000 ---p 00006000 08:05 1056628 /usr/lib/x86_64-linux-gnu/libogg.so.0.8.0
    7f87ab219000-7f87ab21a000 r--p 00005000 08:05 1056628 /usr/lib/x86_64-linux-gnu/libogg.so.0.8.0
    7f87ab21a000-7f87ab21b000 rw-p 00006000 08:05 1056628 /usr/lib/x86_64-linux-gnu/libogg.so.0.8.0
    7f87ab21b000-7f87ab246000 r-xp 00000000 08:05 1056834 /usr/lib/x86_64-linux-gnu/libvorbis.so.0.4.5
    7f87ab246000-7f87ab446000 ---p 0002b000 08:05 1056834 /usr/lib/x86_64-linux-gnu/libvorbis.so.0.4.5
    7f87ab446000-7f87ab447000 r--p 0002b000 08:05 1056834 /usr/lib/x86_64-linux-gnu/libvorbis.so.0.4.5
    7f87ab447000-7f87ab448000 rw-p 0002c000 08:05 1056834 /usr/lib/x86_64-linux-gnu/libvorbis.so.0.4.5
    7f87ab448000-7f87ab6fb000 r-xp 00000000 08:05 1056836 /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2.0.8
    7f87ab6fb000-7f87ab8fa000 ---p 002b3000 08:05 1056836 /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2.0.8
    7f87ab8fa000-7f87ab916000 r--p 002b2000 08:05 1056836 /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2.0.8
    7f87ab916000-7f87ab917000 rw-p 002ce000 08:05 1056836 /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2.0.8
    7f87ab917000-7f87ab961000 r-xp 00000000 08:05 1056033 /usr/lib/x86_64-linux-gnu/libFLAC.so.8.2.0Abgebrochen (Speicherabzug geschrieben)
    )


  • Mod

    Regel der großen drei nicht beachtet:
    http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)

    porky11 schrieb:

    dies ist eine klasse fuer den einfacheren umgang mit Arrays.

    Dir ist bekannt, dass die Klasse für den einfachen Umgang mit Arrays in der Standardbibliothek bereits existiert? vector?



  • Wieso nimmst du den Troll auch noch ernst? Der Code ist teilweise einfach lächerlich anzusehen.

    Array(C d_[]){ 
            _=d_; 
            length=sizeof(d_)/sizeof(C); 
          } 
          Array(int dlength){ 
            _[dlength]; 
            length=dlength; 
          }
    

    Wie kommst du da direkt auf Regel der großen Drei/Fünf? 🙂


  • Mod

    Sone schrieb:

    Wieso nimmst du den Troll auch noch ernst? Der Code ist teilweise einfach lächerlich anzusehen.

    Sonst geht's dir noch gut? Threads löschen, weil der Code da drin schlecht ist? 😮

    Wie kommst du da direkt auf Regel der großen Drei/Fünf? 🙂

    Ich lese mir so einen Code doch nicht im Details durch :p . Klar sind da noch mehr WTFs drin. Aber die direkte Fehlerursache ist sehr sicher Verletzung der Regel der 3/5. Denn eine Nichteinhaltung dieser führt typischerweise eben zu einen double free. Da werfe ich einen Blick auf den Code und sehe, dass diese Vermutung stimmt. Die sonstigen Fehler hier können dieses Verhalten nicht zufriedenstellend erklären.


Anmelden zum Antworten