Ho posto la stessa domanda sul newsgroup della mia università, mi ha risposto il professore

Questa era la mia domanda:

Suppongo di avere una funzione fatta in questo modo:

codice:
int*  nome_funzione( int  )
{
  int* array = new int[ 10 ];
  .....
  .....
  return array;
}
In pratica gli passo un intero (ma è solo un esempio!), e a partire da quel
parametro mi costruisce un array. La funzione mi alloca dinamicamente
l'array e alla fine lo passa (tramite puntatore) al programma chiamante..

Dove devo deallocare l'array?
-> credo non avrebbe senso nella funzione: non posso deallocare qualcosa
che poi deve essere ancora utilizzato!!
-> se poi lo faccio nel programma chiamante, quest'ultimo dovrebbe sapere
come lavora a funzione, cioè dovrebbe essere a conoscenza del fatto che
l'array è stato allocato dinamicamente..e non credo sia una soluzione
pulita!!

Allora?!?

Questa è stata la risposta:

codice:
>int*  nome_funzione( int  )
> {
>   int* array = new int[ 10 ];
>   .....
>   .....
>   return array;
> }
Questo è un "pattern" molto più comune di quanto si potrebbe pensare.

> Dove devo deallocare l'array?
> -> credo non avrebbe senso nella funzione: non posso deallocare
> qualcosa che poi deve essere ancora utilizzato!!

Su questo non c'è dubbio.

> -> se poi lo faccio nel programma chiamante, quest'ultimo dovrebbe
> sapere come lavora a funzione, cioè dovrebbe essere a conoscenza del
> fatto che l'array è stato allocato dinamicamente..e non credo sia una
> soluzione pulita!!

E' una soluzione pulita solo se il chiamante _sa bene_ che la funzione
alloca dinamicamente un oggetto.

E' vero, ci siamo detti tante volte che il chiamante deve ignorare l'implementazione di una funzione e limitarsi solo a conoscerne il prototipo. In certi casi, come quello di sopra, però, il servizio offerto da una funzione è proprio quello di creare un oggetto in base a certe regole (proprio come la funzione CostruisciLista() del nostro esercizio
ListaOrdinata; le regole in quel caso le fissava l'utente). Questo tipo di funzioni si chiamano Factory (fabbrica) e, di solito, hanno il nome che inizia per Create... (CreateList, CreateWidget, CreateComponent, etc...)proprio per ricordare al chiamante che stanno costruendo qualcosa che andrà poi distrutto. Questo comportamento deve ovviamente essere documentato da chi scrive (e documenta) la funzione.
Problema risolto!!!

:metallica