tiefenkopie STL vector mit char*



  • Hallo hab einen Vector, der aus char* besteht. In diesem sollen zb. dateinamen gespeichert werden. Nun ist der string der auch als char* deklariert ist nach ablauf einer funktion nicht mehr vorhanden bzw. um speicherlecks vorzubeugen mit delete beseitigt. Wie kann ich nun eine tiefen kopie in den vector machen, damit die daten erhalten bleiben.

    der vector in der h:

    std::vector<char*> files;
    

    im code dann selbst die übergabe:

    filename_length = (int)fileIO_4.ReadUInt8();
    char* filename = new char[filename_length+1];
    memsetfilename, '\0',filename_length+1);
    
    char byte[1];
    for(int h=0; h<filename_length; h++)
    {
    	byte[0] = fileIO_4.ReadUInt8();
    	memcpy(filename+h,byte,1);
    }
    	memcpy (filename+(filename_length),"",1);
    
    files.push_back(filename);
    

    für den moment ist der name natürlich gepeichert im vector. aber danach wenn der pointer filename gelöscht wird, sind natürlich auch die daten weg.

    Muss ich da irgendwo push_back oder sowas überladen?



  • std::vector<std::string> files;
    
    filename_length = ...;
    std::vector<char> filename (filename_length);
    ...
    files.push_back(string());
    files.back().assign(filename.begin(),filename.end());
    


  • danke, oder ich geb den speicher frei wenn ich den vector lösche



  • du "gibst" gar keinen Speicher frei, das macht std::vectorstd::string ganz alleine für dich wenn er nicht mehr im Scope ist 😉 warum eigentlich nicht std::string ? Das ist ja "sozusagen" ein vector<char>



  • padreigh schrieb:

    warum eigentlich nicht std::string ? Das ist ja "sozusagen" ein vector<char>

    Er will aber einen vector<char*> , also einen Container aus Strings. Und das gekapselte Äquivalent dazu ist eben vector<string> und nicht string ...

    @ greenghecco:
    Von memcpy() , strcpy() und solchen Low-Level-Operationen kannst du mit vector<string> eigentlich komplett die Finger lassen.



  • greenghecco schrieb:

    Hallo hab einen Vector, der aus char* besteht.

    Jede Containerklasse der STL folgt der Wertsemantik und nicht der Pointersemantik. Verwende entweder std::vectorstd::string > oder nimm einen SmartPointer z.B. aus Boost.

    Und gewöhn Dir einen besseren C++ Programmierstil an, das was Du da gepostet hast ist fast reines C.


Anmelden zum Antworten