std::string lokal, mögl. Stack-Overflow



  • Hallo Leute,

    habe ein Problem mit folgendem Code(ausschnitt):

    bool Open(const std::string & name)
    {
    std::ifstream file_in(name.c_str(), std::ios::in | std::ios::binary);
    ...
    data = std::string(size, '\0'); // data = std::string member, size = 200kB
    file_in.read(const_cast<char*>(data.data()), data.size()); // File -> String
    ---
    file_in.close();
    return true;
    }

    Verwendet man für Member <data> einen std::string-Zeiger wird am Heap Speicher reserviert und alles läuft super. Will mir aber das Speichermanagement sparen und wollte per normaler Zuweisung (cctor) Member <data> belegen. Beim return schwirrt die App./der Debugger dann ab. Ich nehme nun an, dass der lokale std::string mit der Größe size (200kB) am Stack angelegt wird und ein Überlauf den weiteren Programmablauf unmöglich macht. Hat jemand dazu Ideen (die mit new std::string und delete std::string) hab ich schon?

    Danke für eure Bemühungen!

    MfG Chris



  • mach mal std::cout << sizeof(std::string);

    mehr speicher wird nicht auf dem stack gebraucht.



  • data = std::string(size, '\0'); // data = std::string member, size = 200kB
    file_in.read(const_cast<char*>(data.data()), data.size()); // File -> String
    

    Frickler...


  • Mod

    data = std::string(size, '\0'); // data = std::string member, size = 200kB
    file_in.read(const_cast<char*>(data.data()), data.size()); // File -> String
    

    das const von data() wegzucasten und dann darauf zu schreiben führt zu UB

    data.assign(size, '\0'); // bzw data.resize(size); falls es nicht auf 0-initialisierung ankommt
    file_in.read(&data[0], size); // oder &*data.begin()
    


  • camper schrieb:

    data = std::string(size, '\0'); // data = std::string member, size = 200kB
    file_in.read(const_cast<char*>(data.data()), data.size()); // File -> String
    

    das const von data() wegzucasten und dann darauf zu schreiben führt zu UB

    data.assign(size, '\0'); // bzw data.resize(size); falls es nicht auf 0-initialisierung ankommt
    file_in.read(&data[0], size); // oder &*data.begin()
    

    Auch davon würde ich persönlich abraten, da der Standard nicht garantiert, dass std::string seinen String "am Stück" als Array von char speichert. Dann doch lieber einen std::vector<char> verwenden.


Anmelden zum Antworten