In che modo std :: string in c ++ alloca la memoria? [chiuso]

4

Ho notato che la libreria di stringhe non ne richiede una per allocare spazio prima di scrivere l'input / output. Come fa la libreria di stringhe a allocare dinamicamente quella memoria, so della parola chiave 'new' in c ++ e 'malloc' in c ma quando provo qualcosa del genere, il mio programma smette di funzionare.

char* str = new char[strlen(str) + 1];
cin>>str;

Non riesco a farlo funzionare in questo modo, come funziona la libreria di stringhe?

Conosco anche i vettori in C ++ ma non sono un grande fan del loro utilizzo, vorrei sapere se c'è un modo per allocare dinamicamente la memoria senza dover allocare una dimensione prima, qualcosa di simile ma non così sofisticato come la stringa. h library.

In che modo la libreria di stringhe riceve input illimitati dall'utente senza che il programmatore specifichi le dimensioni del buffer?

    
posta Hawk 12.08.2014 - 10:49
fonte

2 risposte

15

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)
risposta data 12.08.2014 - 14:12
fonte
4

Se non sei un fan di std::vector potresti non voler sentire questo, ma, per impostazione predefinita, funzionerà più o meno come std::vector .

Quando un string legge da un flusso, è push_back di ogni carattere. Ciò che fa quando viene esaurito lo spazio è in realtà definito dall'allocatore che hai utilizzato per string . L'impostazione predefinita sarà il raddoppio come con i vettori.

Puoi cambiare questo, ovviamente, cambiando l'allocatore ma sembra che non sia davvero la tua domanda. Non c'è modo di pre-allocare una quantità sconosciuta di memoria. Hai davvero solo 3 opzioni: non allocare nessuno, allocare un importo fisso o allocare un importo iniziale e quindi modificarlo dinamicamente come necessario. Le stringhe e i vettori fanno il secondo in modo che facciano ciò che ti aspetteresti, ma con il compromesso che potresti allocare la memoria a seconda della lunghezza esatta della stringa.

    
risposta data 12.08.2014 - 12:58
fonte

Leggi altre domande sui tag