Problem mit Vector in Struktur



  • Hi Leutz!

    Ich hab ein kleines Problem, und zwar habe ich eine Struktur mit einem char-Vector. Wenn ich nun einen Pointer auf diese Struktur habe und sie allokieren will (ich benutze malloc() und realloc(), NICHT new()...) und dann mit push_back() etwas hineinscheiben will, schmiert mir das Programm komplett ab.

    Mein Code (es geht darum, eine Datei zu mappen):

    //Die Struktur...
    struct INFILES
    {
            char* fname;
            std::vector<char> file;
            long offset;
    };
    
    //Der globale Pointer (weil ich ein Dynamisches Array brauch)
    INFILES* infile;
    
    //Das Problem:
    infile = (INFILES*) malloc(sizeof(INFILES));
    infile[0].fname = (char*) malloc((strlen(openfile)+1) * sizeof(char));
    strcpy(infile[0].fname, openfile);
    infile[0].offset = 0;
    
    FILE* ifile = (FILE*) NULL;
    if ((ifile = fopen(openfile, "rb")) == NULL) return 1;
    
    while(!feof(ifile))
    {
         char ch = fgetc(ifile);
         if(!feof(ifile)) infile[0].file.push_back(ch); //Hier stürzt er ab, ch enthält einen Wert!
    }
    fclose(ifile);
    

    Ich wette mal es liegt irgendwie an der Allokierung, aber WO? 🙄

    Grüsse,
    ~code_pilot 😞



  • malloc und free rufen keinen ctor bzw. dtor auf. Beim nächsten Mal solltest die Suche benutzen, die Frage wurde mehrmals beantwortet.



  • Hallo,

    malloc und free hat nur in zweiter Linie etwas mit Konstruktoren und Destruktoren zu tun. malloc und free (oder new und delete) brauchst du nur im Fall von Pointern. Es ist auch völlig irrelevant, ob ein vector eine Klasse (oder ein Klassentemplate) ist oder nicht. Du kannst einen Vektor normal instantieren ohne malloc oder new:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main (void)
    {
    	std::vector<char*>buffer;
    	std::vector<char*>::const_iterator read;
    
    	char* zeilen [] =
    	{
    		{"hallo cplusplus"},
    		{"nur fuer insider"},
    		{"fuenfzehnjaehrige kinder labern nur mist"},
    		{"juengere auch"},
    		{"lesen und verstehen sind 2 verschiedene paar Schuhe"},
    		{"oh junge ..."}
    	};
    
    	/* einfügen in vector */
    	for (int loop=0; loop<(sizeof (zeilen)/sizeof(zeilen[0])); loop++)
    	{
    		buffer.push_back (zeilen[loop]);
    	}
    
    	/* auslesen */
    	read = buffer.begin ();
    
    	while (read != buffer.end ())
    	{
    		printf ("\t Wert ist: %s\n", (*read));
    		read++;
    	}
    
    	getchar ();
    	return 0;
    }
    

    Und bitte hört auf andauernd auf die Suche zu verweisen, denn zu dieser Problematik gibt es 100%ig keine Ergebnisse.

    Gruß Para



  • Parapiler schrieb:

    Hallo,

    malloc und free hat nur in zweiter Linie etwas mit Konstruktoren und Destruktoren zu tun. malloc und free (oder new und delete) brauchst du nur im Fall von Pointern. Es ist auch völlig irrelevant, ob ein vector eine Klasse (oder ein Klassentemplate) ist oder nicht. Du kannst einen Vektor normal instantieren ohne malloc oder new:

    Und bitte hört auf andauernd auf die Suche zu verweisen, denn zu dieser Problematik gibt es 100%ig keine Ergebnisse.

    Was redest du für einen Schwachsinn? Der Speicher für die struct die den vector enhält, reserviert er dynamisch, soweit klar? Dem zu Folge wird der ctor von vector nicht aufgerufen, die Werte bleiben uninitialisiert und der möglicherweise benötigter Speicher wird auch nicht allokiert.

    Die Suche kann auch nützlich sein: 🙄
    http://www.c-plusplus.net/forum/viewtopic.php?t=66047&highlight=malloc+vector
    http://www.c-plusplus.net/forum/viewtopic.php?t=46625&highlight=malloc+vector



  • Hihi,

    was laberst du eigendlich für einen gequollenen Scheiss, Junge, lern erstmal lesen! Wenn Du eine Struktur definierst, und du definierst den Vektor nicht als zeiger, dann wird der Speicher automatisch allokiert. Das hat nix mit nem Vector zu tun, wenn folgender Code funktioniert genauso wie das obrige:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    typedef struct TEST
    {
    	std::vector <char*>buffer;
    	int irgendwasanderes;
    };
    
    TEST tt;
    
    int main (void)
    {
    
    	std::vector<char*>::const_iterator read;
    
    	char* zeilen [] =
    	{
    		{"hallo cplusplus"},
    		{"nur fuer insider"},
    		{"fuenfzehnjaehrige kinder labern nur mist"},
    		{"juengere auch"},
    		{"lesen und verstehen sind 2 verschiedene paar Schuhe"},
    		{"oh junge ..."}
    	};
    
    	/* einfügen in vector */
    	for (int loop=0; loop<(sizeof (zeilen)/sizeof(zeilen[0])); loop++)
    	{
    
    		tt.buffer.push_back (zeilen[loop]);
    	}
    
    	/* auslesen */
    	read = tt.buffer.begin ();
    
    	while (read != tt.buffer.end ())
    	{
    		printf ("\t Wert ist: %s\n", (*read));
    		read++;
    	}
    
    	getchar ();
    	return 0;
    }
    

    Hier ist eindeutitg der Vector ein Element der Struktur und es wird kein malloc oder new gebraucht.

    P.S. : Lass mal die Drogen aus dem Spiel...

    Obwohl die links kann man sich ja mal angucken



  • Nochmal für Downies: er hat eine Struktur, die einen vector enthält:

    //Die Struktur...
    struct INFILES
    {
            char* fname;
            std::vector<char> file;
            long offset;
    };
    

    er definiert einen Zeiger auf diese Struktur:

    //Der globale Pointer (weil ich ein Dynamisches Array brauch)
    INFILES* infile;
    

    weiter allokiert er mittels malloc Speicher:

    infile = (INFILES*) malloc(sizeof(INFILES));
    

    und weiter kracht es:

    infile[0].file.push_back(ch);
    

    Jetzt soweit?


Anmelden zum Antworten