peterpa
Goto Top

Brauche Hilfe bei: std:badalloc

Hallo!

Bin dabei für die Uni ein Programm zu schreiben welches einen Büchereiverband hält. Also Filialen, Kunden, Angestellte, Medien einließt aus einer XML und wieder auf der Konsole ausgibt.

Da ich gestern mein Programm iwie komplett zerschossen habe, habe ich die Gelegenheit genutzt um meine load-Methode, welche ich vorher mit enums realisiert habe, um die verschiedenen Tags und Aufrufe zu unterschieden, neu zu machen. Jetzt stoße ich aber auf Probleme, welche ich vorher nicht hatte...

Konkret:

terminate called after throwing an instance of 'std::bad_allic'

what(): std::bad_alloc


Ich bin davon ausgegangen, dass es davon kommt, dass ich in einer Klasse z.B. eine anderes Objekt in einen Vector gebe und das eben zerstört wird wenn die Methode beendet wird. Allerdings hat es auch nicht geholfen nur die Pointer zu halten...

Hier mal der Code:
LibaryPool.cpp (Auszug):
while (getline(datainput,tmp))
    {
        int posi1 = tmp.find("<");  
        int posi2 = tmp.find(">");  
        int posi3 = tmp.find("</",posi2);  
        string tmpWert = tmp.substr(posi2+1,posi3-posi2-1);
        string tmpTag = tmp.substr(posi1+1,posi2-posi1-1);
        cout << "LibraryPool: "<< tmpTag << " mit dem Wert: " << tmpWert << endl;  
       // cout << tmpTag << " mit dem Wert:: " << tmpWert << endl; 
        if (tmpTag == "Library"){  
            libs.push_back(new TLibary);
            //add(new TLibary)
             cout << "load Library";  
        }else if ("Chairman" == tmpTag){  
            cout << "load Chef";  
            chef->load(datainput);
        }
load->chef funktioniert... (das auskommentierte add ist eigentlich eine Methode welche nur das libs.push_back drin hat...).

LibaryPool.h (Auszug)
vector<TPerson*> customers;
vector<TLibary*> libs;

Konstruktor von TLibary:
Libray.cpp (Auszug)
TLibary::TLibary()
{
    cout << "Library-Konstrukt";  
    //ctor
}
Dieses Cout wird mir noch angezeigt. Das cout nach dem new in LibaryPool.cpp kommt schon nicht mehr...


Debugger sagt:
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb (GDB) 7.6.1
Child process PID: 7908
In __cxa_throw () ()


Kann mir da jemand weiter helfen?

P.S.
Ja ich weiß das heißt Library ... xD

Content-Key: 340191

Url: https://administrator.de/contentid/340191

Printed on: May 10, 2024 at 22:05 o'clock

Member: Sheogorath
Sheogorath Jun 09, 2017 at 18:24:27 (UTC)
Goto Top
Moin,

sieht aus als hättest du wenig RAM bzw. generell ein Memoryleak.

Die Referenz zu bad_alloc ist da recht eindeutig.

Aber mit Gewissheit kann man das so nicht einfach sagen, denn die wirklich wichtigen Stellen fehlen hier.

Es gibt aber noch andere Fälle wo dieser Fehler auftreten kann:
https://stackoverflow.com/a/8397204

Eine recht allgemein gehaltene Referenz auch hier nochmal:
https://stackoverflow.com/questions/9456728/how-to-deal-with-bad-alloc-i ...

Und all diese Hinweise und viele mehr sind auch sehr schnell und einfach zu finden: https://is.gd/uX065I

Ich hoffe es hilft und erleichtert dir die Arbeit in Zukunft etwas...

Gruß
Chris
Member: peterpa
peterpa Jun 11, 2017 at 11:13:19 (UTC)
Goto Top
Hallo,

und danke erstmal. Also ich habe mal den RAM im Auge behalten da passiert nicht viel ...
Bzw. im Konstruktor steht selber nicht viel drin... Auch die Klasse ist nicht "mehr" als andere...
TLibary.h (Auszug):
 public:
        TLibary();
        TLibary(string a);
        TLibary(string a, TAdress *b, TEmployee *c);
        TLibary(TAdress *a, TPerson *b);
        virtual ~TLibary();
        void print();
        void add(TMedium *a); //wie?
        void load(fstream &in);
    protected:
    private:
        enum inTags{eemployee,emanager,emedium,eadress,ewarten,enichts};
        inTags enu = enichts;
        string name ;
        vector<TMedium*> vecMedium;
        //vector<TCustomer*> vecCustomer;
        TAdress *filadr;
        TEmployee *filleader;


Aber mit Gewissheit kann man das so nicht einfach sagen, denn die wirklich wichtigen Stellen fehlen hier.

Was würde denn weiterhelfen zur Fehlerfindung?
Member: peterpa
peterpa Jun 11, 2017 updated at 11:56:40 (UTC)
Goto Top
Sooo ...

habe auch mal den Konstruktor ausgeschrieben ...
Sieht nun so aus:
TLibary::TLibary()
{
    cout << "Library-Konstrukt";  
    //ctor
    name = "name";  
    cout << name << endl;
    vector<TMedium*> vecMedium;
    cout << "Nach dem Medium" << endl;  
    //vecMedium.append(new TMedium);
    cout << "Nach dem new TMedium" << endl;  
    TAdress *filadr = new TAdress;
    cout << "Nach der Adresse" << endl;  
    TEmployee *filleader = new TEmployee;
    cout << "Nach der nach der TEmployee" << endl;  
}

Bekomme diese Ausgabe:
Library-Konstruktname
Nach dem Medium
Nach dem new TMedium
Address-KonstruktorNach der Adresse
Address-KonstruktorNach der nach der TEmployee
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc


Also ist die Instanz/Objekt von TLibary zu groß? Diese ist doch aber meines Wissens nicht größer als dessen Inhalts oder? Also wenn ich ne Klasse definiere mit nur einem Integer drin dann hat diese Klasse doch den selben Speicherbedarf wie ein Integer oder nicht?

Bitte... Hilfe >.<
Member: peterpa
peterpa Jun 13, 2017 at 09:10:16 (UTC)
Goto Top
Hallo,

konnte es inzwischen so weit eingrenzen, dass ich herraus gefunden habe, dass es an dem Vector liegt. Habe es mit einem Array versucht, das hat geklappt. Nun ist die Frage warum? - Ja ich weiß das hört man oft, ich selber oft genug, aber ich bin der Meinung das ich zu den vorheriegen Versionen des Programmes nichts an dem Vector geändert habe. Hier mal der Codeausschnitt ... (einmal habe ich ein Vector mit Pointern versucht einmal ein Vector der Objekte hält jedes mal der selbe Fehler...)

Pointer-Version:
LibaryPool.h
...
private:

        string dataString;
        ifstream datainput;
        string band;
        TEmployee *chef;
        vector<TPerson*> customers;
        vector<TLibary*> libs;   // hier!
...

LibaryPool.cpp:
...
if (tmpTag == "Library"){  
            testarray[testarrayint] = new TLibary();
            testarrayint++;
            TLibary a;                                          // das funktioniert
            libs.push_back(new TLibary());    // hier kommt bad_alloc
             cout << "load Library";  
...


Objekt-Version:
LibaryPool.h
...
private:

        string dataString;
        ifstream datainput;
        string band;
        TEmployee *chef;
        vector<TPerson*> customers;
        vector<TLibary> libs;                      //hier
...

LibaryPool.cpp
...
if (tmpTag == "Library"){  
            testarray[testarrayint] = new TLibary();
            testarrayint++;
            TLibary a;                                                                  //klappt
            cout << "objekt erzeugt" << endl;                          // wird ausgegeben  
            libs.push_back(a);                                                  // bad_alloc
             cout << "load Library";  
...


Habe wie gesagt meines Wissens nichts veränder an dem Vector, es kamen "nur" neue Ableitungen hinzu aber auch nicht von TLibary oder T LibaryPool ...

Fehlt da ein Iterator? - Hatte vorher auch keinen ...

Danke im Vorraus, wenn jemand helfen kann.