Oggetto creato dentro una funzione

di il
8 risposte

Oggetto creato dentro una funzione

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;
}

8 Risposte

  • Re: Oggetto creato dentro una funzione

    Domanda banale: su quale libro stai studiando?
    Scusa, ma la risposta a questa domanda la sai gia'!
    Hai un intero thread TUO sull'argomento!

    Passa a Python, fidati!
  • Re: Oggetto creato dentro una funzione

    Devi usare delete
    
        // Allocazione Heap memory 
        char* a = new char[10];  
    
        // Deallocazione Heap memory 
        delete[] a; 
    
    Comunque ha ragione migliorabile, che devi fare in C++?
    Ci sono linguaggi con garbage collector, tipo C# o Java.
    Il C++ è un linguaggio ostico e di nicchia. Non penso che tu voglia arrivare a scrivere driver o motori grafici
  • Re: Oggetto creato dentro una funzione

    Ciao , non volevo chiedere come cancellare , ma dove inserire il delete[].
    Non so se devo inserirlo prima del return, ma non credo o nel main ma anche li non credo abbiamo senso

    Non ho un libro. Pensavo al libro di Bjarne Stroustrup
    Non voglio scrivere driver o motori grafici , vorrei solo capire qualcosa in più prima di affrontare un linguaggio a più alto livello
    Grazie
  • Re: Oggetto creato dentro una funzione

    Edit - non avevo visto che hai messo la stringa nel prototipo. Allora è meglio creare e distruggere nel main

    Per questo ti consigliavo di usare un linguaggio con il garbage collector che ci pensa lui a distruggere gli oggetti. Che senso ha perdere tempo con queste cose a livello amatoriale/di apprendimento?
  • Re: Oggetto creato dentro una funzione

    Ciao ,
    una soluzione è non utilizzare un oggetto per memorizzare le vocali , ma una semplice stringa.( ho tradotto in inglese).
    
    	for (char c : statement) {
    		for (char vowelsList : vowels) {
    			if (vowelsList == c) {
    				result += c;
    			}
    		}
    	}
    	return result;
    }
    

    Weierstrass ha scritto:


    Edit - non avevo visto che hai messo la stringa nel prototipo. Allora è meglio creare e distruggere nel main

    Per questo ti consigliavo di usare un linguaggio con il garbage collector che ci pensa lui a distruggere gli oggetti. Che senso ha perdere tempo con queste cose a livello amatoriale/di apprendimento?
    Io dalla mia posizione di principiante non posso che darti ragione.
    ma prima di passare al Java o C# ( non saprei cosa scegliere) vorrei capire realmente cos'è un puntatore, l'heap ecc. Non voglio partire con il creare un videogioco. Spero di non rompere troppo le scatole
  • Re: Oggetto creato dentro una funzione

    None ha scritto:


    Io dalla mia posizione di principiante non posso che darti ragione.
    ma prima di passare al Java o C# ( non saprei cosa scegliere) vorrei capire realmente cos'è un puntatore, l'heap ecc. Non voglio partire con il creare un videogioco. Spero di non rompere troppo le scatole
    Passa a Python! : sintassi semplice, unico vincolo è l'indentazione. Ha una libreria infinita (ci puoi fare anche programmi con interfaccia grafica grazie al porting di librerie quali Qt e Wx).
  • Re: Oggetto creato dentro una funzione

    None ha scritto:


    ma prima di passare al Java o C# ( non saprei cosa scegliere) vorrei capire realmente cos'è un puntatore, l'heap ecc. Non voglio partire con il creare un videogioco. Spero di non rompere troppo le scatole
    Puoi provare questo

    Funzione di test:
    
    char* array_ciao(int& dimensione){
    	int byte_da_allocare = 5;
    	char* arr = new char[byte_da_allocare];
    
    	arr[0] = 'C';
    	arr[1] = 'i';
    	arr[2] = 'a';
    	arr[3] = 'o';
    	arr[4] = '\0';
    
    	dimensione = byte_da_allocare;
    	return arr;
    }
    
    nel main:
    
    	int size;
    	char* stringa = array_ciao(size);
    	printf(stringa);
    	printf("\r\nDimensione = %d\n", size);
    	delete[] stringa;
    
    metti byte_da_allocare = 500000000 e sei vai in debug, passo per passo, potrai vedere l'allocazione della memoria e la deallocazione nella finestra di gestione delle attività.

    In alternativa c'è std::vector
  • Re: Oggetto creato dentro una funzione

    Grazie .
    ora sono dietro ad un programmino inutile testuale per memorizzare le poesie... ahah è il mio prossimo esercizio...
Devi accedere o registrarti per scrivere nel forum
8 risposte