[C++] Zweidimensionales dynamisches std::string-Array



  • Hallo,

    ich möchte ein zweidimensionales dynamisches Array erstellen. Dazu habe ich folgenden Code geschrieben:

    #include <string>
    
    int size_programCode = 7;
    int size_byteCode = 7;
    
    std::string** byteCode = new std::string*[size_programCode];
    for (int i = 0; i < size_programCode ; i++)
    {
    	byteCode[i] = new std::string[size_byteCode];
    }
    

    Leider bekomme damit folgende Fehlermeldung:

    *** glibc detected *** /home/{...}/workspace/RAMses/Debug/RAMses: malloc(): memory corruption: 0x000000000074f240 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x7a6e6)[0x7ffe9437a6e6]
    /lib/x86_64-linux-gnu/libc.so.6(+0x7c248)[0x7ffe9437c248]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_malloc+0x6d)[0x7ffe9437e3cd]
    /usr/lib/x86_64-linux-gnu/libstdc++.so.6(_Znwm+0x1d)[0x7ffe949714cd]
    /usr/lib/x86_64-linux-gnu/libstdc++.so.6(_Znam+0x9)[0x7ffe949715e9]
    /home/{...}/workspace/RAMses/Debug/RAMses[0x402ff9]
    /home/{...}/workspace/RAMses/Debug/RAMses[0x40319e]
    /home/{...}/workspace/RAMses/Debug/RAMses[0x402874]
    /home/{...}/workspace/RAMses/Debug/RAMses[0x4076b7]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7ffe9432130d]
    /home/{...}/workspace/RAMses/Debug/RAMses[0x4014e9]
    ======= Memory map: ========
    00400000-0040a000 r-xp 00000000 fc:00 1453698                            /home/{...}/workspace/RAMses/Debug/RAMses
    00609000-0060a000 r--p 00009000 fc:00 1453698                            /home/{...}/workspace/RAMses/Debug/RAMses
    0060a000-0060b000 rw-p 0000a000 fc:00 1453698                            /home/{...}/workspace/RAMses/Debug/RAMses
    0074d000-0076e000 rw-p 00000000 00:00 0                                  [heap]
    7ffe90000000-7ffe90021000 rw-p 00000000 00:00 0 
    7ffe90021000-7ffe94000000 ---p 00000000 00:00 0 
    7ffe9407c000-7ffe940ff000 r-xp 00000000 fc:00 265878                     /lib/x86_64-linux-gnu/libm-2.13.so
    7ffe940ff000-7ffe942fe000 ---p 00083000 fc:00 265878                     /lib/x86_64-linux-gnu/libm-2.13.so
    7ffe942fe000-7ffe942ff000 r--p 00082000 fc:00 265878                     /lib/x86_64-linux-gnu/libm-2.13.so
    7ffe942ff000-7ffe94300000 rw-p 00083000 fc:00 265878                     /lib/x86_64-linux-gnu/libm-2.13.so
    7ffe94300000-7ffe94497000 r-xp 00000000 fc:00 265874                     /lib/x86_64-linux-gnu/libc-2.13.so
    7ffe94497000-7ffe94696000 ---p 00197000 fc:00 265874                     /lib/x86_64-linux-gnu/libc-2.13.so
    7ffe94696000-7ffe9469a000 r--p 00196000 fc:00 265874                     /lib/x86_64-linux-gnu/libc-2.13.so
    7ffe9469a000-7ffe9469b000 rw-p 0019a000 fc:00 265874                     /lib/x86_64-linux-gnu/libc-2.13.so
    7ffe9469b000-7ffe946a1000 rw-p 00000000 00:00 0 
    7ffe946a1000-7ffe946b6000 r-xp 00000000 fc:00 261676                     /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ffe946b6000-7ffe948b5000 ---p 00015000 fc:00 261676                     /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ffe948b5000-7ffe948b6000 r--p 00014000 fc:00 261676                     /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ffe948b6000-7ffe948b7000 rw-p 00015000 fc:00 261676                     /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ffe948b7000-7ffe9499f000 r-xp 00000000 fc:00 397288                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
    7ffe9499f000-7ffe94b9f000 ---p 000e8000 fc:00 397288                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
    7ffe94b9f000-7ffe94ba7000 r--p 000e8000 fc:00 397288                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
    7ffe94ba7000-7ffe94ba9000 rw-p 000f0000 fc:00 397288                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
    7ffe94ba9000-7ffe94bbe000 rw-p 00000000 00:00 0 
    7ffe94bbe000-7ffe94bdf000 r-xp 00000000 fc:00 261858                     /lib/x86_64-linux-gnu/ld-2.13.so
    7ffe94dc5000-7ffe94dca000 rw-p 00000000 00:00 0 
    7ffe94ddb000-7ffe94dde000 rw-p 00000000 00:00 0 
    7ffe94dde000-7ffe94ddf000 r--p 00020000 fc:00 261858                     /lib/x86_64-linux-gnu/ld-2.13.so
    7ffe94ddf000-7ffe94de1000 rw-p 00021000 fc:00 261858                     /lib/x86_64-linux-gnu/ld-2.13.so
    7fffdbfbd000-7fffdbfde000 rw-p 00000000 00:00 0                          [stack]
    7fffdbfff000-7fffdc000000 r-xp 00000000 00:00 0                          [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    

    Über Hilfe eurerseits wäre ich sehr dankbar. Wo ist mein Fehler?

    Gruß,
    Mhenlo



  • Warum nimmst du an, dass der Fehler in dem Codeschnipsel liegt?



  • Schau Dir doch mal folgendes 2d dyamisches Array an, vielleicht hilft es Dir
    bei der Fehlersuche.

    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        int Zeilen = 3 ;
        int Spalten = 4 ;
    
        int **array;
    
        array = new int * [ Zeilen ] ;
    
        for( int i = 0  ; i < Zeilen ; ++i )
        {
            array[i] = new int [Spalten];
    
            for( int j = 0 ; j < Spalten ; ++j )
            {
                array[i][j] = i + j ;
            }
        }
       delete[]array;
       return 0;
    }
    


  • Beim Debuggen bricht das Programm an dieser Stelle ab



  • Das ganze wird innerhalb eines Konstruktors aufgerufen

    RamMachine::RamMachine()
    {
    this->accumulator = 0;
    this->programCounter = 0;
    this->indexRegister = new int(Config::getInstance()->getMaxIndexRegister());
    for (int j = 0; j < Config::getInstance()->getMaxIndexRegister() ; j++)
    {
    	indexRegister[j] = 0;
    }
    this->memoryRegister = new int(Config::getInstance()->getMaxMemoryRegister());
    for (int h = 0; h < Config::getInstance()->getMaxMemoryRegister() ; h++)
    {
    	memoryRegister[h] = 0;
    }
    
    this->programCode = new string[Config::getInstance()->getMaxProgramCode()];
    
    this->byteCode = new string*[Config::getInstance()->getMaxProgramCode()];
    for (int i = 0; i < Config::getInstance()->getMaxProgramCode() ; i++)
    {
           this->byteCode[i] = new string [Config::getInstance()->getMaxByteCode()];
    }
    }
    

    Dabei werden die Werte für die Größe der Array aus einer Singleton-Klasse Config herausgelesen.



  • Mit vector wäre das nicht passiert.



  • Beschreib mal dein Problem. Mein 2D-Nutzlos gefährliches Pointergefrikel funktioniert nämlich:

    #include <iostream>
    #include <string>
    
    using std::string;
    using std::cout;
    using std::endl;
    
    int main()
    {
    	string **dynarray = new string *[2];
    
    	for (int i = 0; i < 2; ++i)
    		dynarray[i] = new string[13];
    
    	for (int i = 0; i < 2; ++i)
    		for (int j = 0; j < 13; ++j)
    		{
    			dynarray[i][j] = "something";
    		}
    
    	for (int i = 0; i < 2; ++i)
    		for (int j = 0; j < 13; ++j)
    		{
    			cout << j << endl;
    			cout << dynarray[i][j] << endl;
    		}
    
    	for (int i = 0; i < 2; ++i)
    		delete[] dynarray[i];
    
    	delete[] dynarray;
    }
    


  • Wie würde das mit vector aussehen?

    Ich nehme an im Header die Deklaration:

    vector< vector<string> > byteCode;
    

    Und in der cpp-Datei(bzw. im Konstruktor) die Bestimmung der Größe:

    byteCode.resize(Config::getInstance()->getMaxProgramCode());
    for(int i = 0; i < Config::getInstance()->getMaxProgramCode(); i++)
    {
        byteCode[i].resize(Config::getInstance()->getMaxByteCode());
    }
    

    Kommt das in etwa hin?



  • Das ganze möchte ich folgendermaßen nutzen:

    Ich habe ein eindimensionales Array mit strings. Dieses möchte ich zur weiteren verarbeitung in einzelne Tokens zerlegen, um später zu entscheiden wie weiter damit umgegangen werden soll.



  • Mhenlo schrieb:

    Das ganze möchte ich folgendermaßen nutzen:

    Ich habe ein eindimensionales Array mit strings. Dieses möchte ich zur weiteren verarbeitung in einzelne Tokens zerlegen, um später zu entscheiden wie weiter damit umgegangen werden soll.

    Also hast du Paare? (Einmal den string und einmal die Tokens)
    Vermutlich eine kranke Idee, aber wie wärs mit einem Vektor von std::pair,wo das erste im Pair der String ist und das zweite ein Vektor der Tokens? Oder sogar eine Map, mit dem string als Key und den Tokens als Vektor als Wert?



  • Du wolltest hier [] statt () (und etwas später auch)?

    this->indexRegister = new int(Config::getInstance()->getMaxIndexRegister());
    


  • Das sind zurzeit jeweils 7 zueinandergehörende Strings.



  • Zeig mal die Funktion, die die Eingabe in Tokens zerlegt. Vielleicht gibt es ja noch sinnvollere Datenstrukturen.



  • Mhenlo schrieb:

    Das sind zurzeit jeweils 7 zueinandergehörende Strings.

    Wie gesagt, bei Paaren würde ich zu einer Map greifen.



  • Danke manni66,

    auf den Fehler hät ich selber kommen können... aber manchmal scheint man wohl Tomaten auf den Augen zu haben 🙂

    Es funktioniert nun alles wie gewünscht, danke allen für die Hilfe.

    Gruß,
    Mhenlo



  • Mhenlo schrieb:

    Danke manni66,

    auf den Fehler hät ich selber kommen können... aber manchmal scheint man wohl Tomaten auf den Augen zu haben 🙂

    Es funktioniert nun alles wie gewünscht, danke allen für die Hilfe.

    Ich hoffe doch du hast jetzt vector genommen.



  • Noch nicht, werde es mit aber gleich mal zur Brust nehmen 🙂


Anmelden zum Antworten