Ciao
Ho seguito il consiglio letto sul web di iniziar con cose del tipo conta le vocali , inverti le parole ecc
Nel programma di seguito riportato , ho due funzioni , una inverte una frase , l'altra estrae le vocali.
Sembrano funzionare, ma la char array che contiene la frase era inizialmente di dimensione fissa.
Ho creato in seguito un array dinamico con la parola chiave new. Tutto sembra funzionare come prima , ma ho questo dubbio:
Quando creo un array di valore fisso all'interno di una funzione , essa è da considerarsi locale/automatica. La sua esistenza è
confinata all'interno della funzione perchè lavora su uno storage di tipo local.
Quando creo un array dinamico , lo storage è di tipo global (heap) . L'array quindi non cessa di esistere all'uscita della funzione.
la domanda è , in che modo e con quale riferimento io posso distruggere l'array e liberare memoria ?
di seguito il codice oppure il link
https://hastebin.com/wuvubedozi.cp
#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
string inverti(string str);
string estraiVocali(string str);
int main()
{
string frase = "Cantami, o diva, del Pelìde Achille l'ira funesta che infiniti addusse lutti agli Achei";
string invertita;
string vocaliEstratte;
std::cout << "Hello World!\n";
cout << "Frase: " << frase << endl;
invertita = inverti(frase);
cout << "Invertita: " << invertita << endl;
vocaliEstratte = estraiVocali(invertita);
cout << "Vocali: " << vocaliEstratte << endl;
return 0;
}
string estraiVocali(string str) {
char vocali[] = { 'a','e','i','o','u' };
int len = str.size();
int cont = 0;
/*****************************************************************************************/
//char cosaHoTrovato[10]; //<- Versione precedente con valore fisso
/*****************************************************************************************/
char *cosaHoTrovato = NULL; // con array allocata dinamicamente.Inizializzo pointer
cosaHoTrovato = new char[len];// alloco n char quanti son contenuti in str
/*****************************************************************************************/
cout << "\nSize: " << len << endl;
for (char carattere : str) {
for (char vocale : vocali) {
if (vocale == carattere) {
cosaHoTrovato[cont++] = vocale;
// cout << vocale << " " << carattere << " " << cont << endl; // debug
}
}
}
cosaHoTrovato[cont] = '\0'; // esclude le locazioni non utilizzate
return cosaHoTrovato;
}
string inverti(string str)
{
int len = str.size();
string invertiStr = str;
cout << "\nSize: " << len << endl;
for (char c : str)
{
invertiStr[--len] = c;
//cout << c << " " << len << endl; //debug
}
return invertiStr;
}