Vediamo la cosa da una prospettiva diversa.
In C le stringhe sono array di caratteri NULL terminated (dette anche ASCIIZ). Questo significa che sostanzialmente sono array e vanno trattate come tali. Per dare un minimo supporto alle stringhe ASCIIZ il C mette a disposizione una serie di funzioni di libreria (strcpy per copiare, strcat per concatenare etc.) per poterle manipolare. Queste funzioni però richiedono che chi le usa dia spazio sufficiente alla stringa di destinazione, pena comportamento indefinito, e che in ogni momento del programma sappia esattamente cosa succeda alla sua stringa ASCIIZ. Ne consegue che se tu allochi una stringa ASCIIZ, tu sappia in ogni momento se tale stringa ASCIIZ sia valida, per quanto tempo sia valida, quando deallocarla, non deallocarla due volte ( se no scoppia tutto), sapere se è sufficiente o no per ospitare una sequenza di caratteri e altre cosette che non sto qui a elencare.
Ora uno potrebbe anche dire: ma invece di dovermi preoccupare di tutto questo io personalmente, non posso in C++ crearmi una classe che gestisca tutte le operazione più comuni su una ASCIIZ string del C e risolvere il problema una volta per tutte?
Risposta: SI. PUO'. FARE! (urlato alla Frankesten Junior )
Iniziamo quindi a scrivere una classe String prevedendo ogni possibile caso di utilizzo, salvo poi scoprire che esiste una classe che fa le stesse cose (e probabilmente meglio) nella libreria standard del C++ : std::string.
Si scopre così che per copiare una std::string si usa = invece di strcpy() o per concatenarle si usa l'operatore + invece di strcat() e che per fare tutto questo non ci si deve preoccupare di dimensionare a priori la stringa, ma provvede da sola a farlo. Tiene traccia della sua dimensione, quando deallocare le strutture interne e quando no etc.
Detto in parole povere: preferisci lavare i panni a mano o usare una lavatrice?