How does std::string in c++ allocate memory?
secondo necessità, in modo trasparente per l'utente.
i know of the 'new' keyword in c++ and 'malloc' in c but when i try something like this, my program stops working.
char* str = new char[strlen(str) + 1];
cin>>str;
Bene ... sì; strlen
conta i caratteri consecutivi all'indirizzo fornito, finché non incontra uno zero. Nel tuo caso, l'indirizzo specificato non è impostato (sarà impostato dopo strlen viene valutato) in modo da chiamare efficacemente strlen con qualche input casuale - non c'è modo che funzioni.
I also know of vectors in C++ but not a big fan of using them,
Dovresti davvero essere davvero (davvero davvero). Si tratta di un wrapper estremamente sottile (leggi: veloce) sulla creazione di blocchi di memoria contigui dinamici (esattamente quello che stai cercando di risolvere), che fornisce sicurezza di tipo, sicurezza dei limiti di memoria e gestione automatica della memoria.
i would like to know if there's a way to dynamically allocate memory without having to allocate a size before
No.
something close but not as sophisticated as the string.h library.
string.h non è in grado di allocare memoria senza conoscere la dimensione. Calcola le dimensioni ogni volta che è necessario allocare memoria, a un costo di runtime (ad esempio, utilizzando strlen quando necessario).
How does the string library get unlimited input from user without the programmer specifying buffer size?
Non è così. Quello che fa (in pseudocode approssimativo) è questo:
- calcola la dimensione dell'input (probabilmente richiedendolo dal vapore di input attraverso un'API)
- calcola la nuova dimensione che la stringa dovrebbe avere dopo aver letto
- alloca la memoria (a seconda delle nuove dimensioni), se necessario
- copia i dati nella nuova memoria
- cancella la vecchia memoria e usa invece la nuova (se è stata impostata una vecchia memoria / valore)