vector problem



  • hola leute

    ich erstelle nen vector mit ner eigenen klasse. im konstruktor allokiere ich 1500 byte fuer den buffer.

    std::vector<myClass*> test;
    /*
    class myClass
    {
       ...
       public:
          char *buffer;
       ...
    };
    
    test->resize(5);
    for(unsigned int i = 0;i < 6;i++)
    {
       test[i] = new myClass;
    }
    
    char *serve = test[0]->buffer;  // (1)
    

    wenn ich dann allerdings auf den buffer zugreifen will, heisst es, das der buffer ins nirvana zeigt.
    was hab ich da falsch gemacht ?

    Meep Meep



  • du hast den buffer nicht initialisiert.
    [EDIT] poste mal den code von konstructor bitte[/EDIT]



  • ich hab doch oben geschrieben das ich den buffer initialisiert habe.

    aber wennst den konstruktor sehen willst, bitte:(gleich mit destruktor)

    TxlVoiceBuffer::TxlVoiceBuffer(void)  // hab ich frueher auf myClass umbenannt
    {
       buffer_size = 1500;
       buffer = new char[1500];
    }
    
    TxlVoiceBuffer::~TxlVoiceBuffer(void)
    {
       if(buffer)
          delete[] buffer;
    }
    

    Meep Meep



  • [ratmodus an]
    Das Objekt wird Kopiert.
    Der Zeiger wird in ein neues Objekt kopiert.
    Der Speicher der Quelle wird gelöscht.
    Der Kopierte Zeiger ist ungültig.

    Lösung:

    Kopierkonstruktor und op = implementieren

    Zum testen ob der verwendet wird trag ihn einfach mal private ein und schau ob der Compiler meckert.
    [/ratmodus an]

    Arg, die Liste hat ja MyClass * und nicht MyClass

    Sry mal wieder nur halb gelesen



  • Hm. Ich bin für ein vollständiges Minimalbeispiel 🙂
    Erster Stress-Vermeidungs-Vorschlag wäre natürlich, möglichst viele * rauszuschmeißen, v.A. buffer und buffer_size einfach durch einen vector<char> zu ersetzen...



  • jetzt hab ich den vector einfach gegen ein normales array ersetzt, und siehe da, es funktioniert ohne probleme.
    ich glaub, ich werd auf das stl-zeugs verzichten und die sachen selber programmieren. is zwar aufwendiger, aber dann funktionierts wenigstens

    Meep Meep



  • Wenn man Vector und co richtig einsetzt, dann funktioniert es damit auch! Meistens sogar besser, weil man sich nicht um das allokieren, kopieren und löschen von Speicher kümmern muss!

    Warum benutzt du denn in deinem Beispiel einen vector<Objects *>? Müssen die Objekte unbedingt als Zeiger im Vector stehen`?



  • ja muessen sie.
    die objekte werden naemlich im laufe der zeit ausgetauscht, und das geht dann am besten mit zeigern.
    wenn ich nen vector ohne aenderung des sources an sich gegen ein array tauschen kann, und dann mein problem geloest ist, dann kann ich wohl kaum was falsch gemacht haben.

    Meep Meep



  • "stürzt nicht ab" == "funktioniert"?
    Der Code, den du unten auskommentiert gepostet hast, stürzt bestimmt auch unter bestimmten Umständen nicht ab (wenn man mal das -> vor dem resize zu einem . macht). Trotzdem ist es falsch, alle sechs Zeiger des fünf Elemente großen vectors zuzuweisen. Ich bezweifle, dass der Fehler in deiner Implementierung von std::vector liegt, wenn es sich gerade nicht um eine Alpha-Version irgendeiner neuen Bibliothek handelt.

    Und um die Objekte auszutauschen, würde ich ihnen lieber ein swap() geben.



  • der code oben sollte eignedlich folgend aussehen:

    std::vector<myClass*> test; 
    /* 
    class myClass 
    { 
       ... 
       public: 
          char *buffer; 
       ... 
    }; /*
    
    test.resize(5); 
    for(unsigned int i = 0;i < 5;i++) 
    { 
       test[i] = new myClass; 
    } 
    
    char *serve = test[0]->buffer;  // (1)
    

    damit die leute wussten, was die var buffer sein soll. bei der for-schleife hatte ich mich hier vertippt. sollte ne 5 sein.war gestern dann schon so genervt, das ich hier mist getippt hatte.
    aendert aber trotzdem nix an der sache, das n array funktioniert, und bei nem vector kann ich auf den buffer nicht mehr zugreifen.
    das es sich bei std::vector um ne alpha handelt, glaub ich weniger. benutze BCB6. da sollte keine alpha mehr rumgeistern
    ich denk mal schon, das es irgendwo an mir liegt. aber ich seh an solcher bibliotheke keinen sinn, wenn ich stundenlang suchen muß, weil er mir so nen bloeden fehler ausgibt und man nicht draufkommt woher der kommt. in der zeit haette ich nuetzlicheres machen koennen. ist ja nicht so, das ich da 1000de zeilen unueberschaubaren code haette. der macht eh noch nix anderes. viel mehr als was ich gepostet habe, ist da noch net. und ein gutes buch oder tutorial ueber die stl, bzw. templates hab ich leider auch noch nicht gefunden. zumindest kein deutsches.
    alleine resize fuer die groesse schon am anfang herzunehmen scheint mir net grad elegant zusein. leider hab ich nicht die zeit, das ich alles ausprobiere, bis ich vielleicht mal den richtigen weg durch zufall gefunden habe.
    ups is jetz aber lang geworden.

    Meep Meep



  • alleine resize fuer die groesse schon am anfang herzunehmen scheint mir net grad elegant zusein

    Dafür isses ja eigentlich auch nicht gedacht. Du kannst deinen Vector ja gleich initialisieren:

    std::vector<myClass*> test(5);
    


  • Du kannst eine lib nicht für eigenen schlechten Stiel verantwortlich machen.

    Wir können Dir nicht sagen wo das Problem liegt da zu wenig source vorhanden ist. Das es aber mit einem normalen array geht deutet aber doch irgendwie darauf hin das da was in schieflage geraten ist.

    aber ich seh an solcher bibliotheke keinen sinn, wenn ich stundenlang suchen muß, weil er mir so nen bloeden fehler ausgibt und man nicht draufkommt woher der kommt

    Ja das ist wohl war, aber doch nich einfach aufgeben 🤡

    Hast Du Dir denn mal Patches für den BCB geholt ? Hatte damals enorme Probleme mit der STL. ka ob der vector da nen prob hatte, aber schau Dich mal auf der HP von Borland um, die Patches gibts kostenlos.



  • Poste doch mal ein ausführbares Minimalbeispiel, bei dem er abschmiert, bis jetzt haben wir nur irgendwelche (wie du sagst sogar falsch abgeschriebene) Codefragmente, damit kann man nicht weiterhelfen!


Anmelden zum Antworten