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 -> StringFrickler...
-
data = std::string(size, '\0'); // data = std::string member, size = 200kB file_in.read(const_cast<char*>(data.data()), data.size()); // File -> Stringdas 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 -> Stringdas 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.