Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - warning: function returns address of local variable
Forum - C/C++ - warning: function returns address of local variable

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Non riesco a far zittire il compilatore da questo warning...
Questo è la mia funzine!

Codice sorgente - presumibilmente C++

  1. int *
  2. print_array(int a, int b){
  3.    int array[5];
  4. ......... /*operazioni*/
  5.  
  6.    return &array; /*in questa riga mi da warning*/
  7.  
  8. }



come posso risolvere questo warning??

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 10:46
Venerdì, 02/07/2010
Testo quotato

Postato originariamente da giovybus:

Non riesco a far zittire il compilatore da questo warning...
Questo è la mia funzine!

Codice sorgente - presumibilmente C++

  1. int *
  2. print_array(int a, int b){
  3.    int array[5];
  4. ......... /*operazioni*/
  5.  
  6.    return &array; /*in questa riga mi da warning*/
  7.  
  8. }




come posso risolvere questo warning??



la variabile "array" risiede nella memoria locale (lo stack) di questa particolare funzione. Nessun'altra funzione può accedervi. Nel momento stesso in cui la funzione ritorna, il suo stack viene distrutto (non esattamente, ma è come se lo fosse).

Devi allocare la memoria nell'heap, prima di chiamare la funzione, passare il buffer, riempirlo e ritornare..

Potresti anche allocare "dentro" la funzione, ma è una pratica sbagliata e che sconsiglio caldamente, perchè genera facilmente numerosi memory leaks.

la soluzione migliore è:
Codice sorgente - presumibilmente C++

  1. /* Alloco la memoria */
  2. int * buffer = malloc(NUMERO_ELEMENTI * sizeof(int));
  3.  
  4. /* passo il buffer alla funzione, che lo modifica */
  5. print_array(buffer, a, b);
  6.  
  7. /* faccio il resto */
  8.  
  9. void print_array(int * buffer, int a, int b)
  10. {
  11.  /* tuo codice */
  12. }


PM Quote
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 10:52
Venerdì, 02/07/2010
Testo quotato

Postato originariamente da TheKaneB:

Testo quotato

Postato originariamente da giovybus:

Non riesco a far zittire il compilatore da questo warning...
Questo è la mia funzine!

Codice sorgente - presumibilmente C++

  1. int *
  2. print_array(int a, int b){
  3.    int array[5];
  4. ......... /*operazioni*/
  5.  
  6.    return &array; /*in questa riga mi da warning*/
  7.  
  8. }




come posso risolvere questo warning??



la variabile "array" risiede nella memoria locale (lo stack) di questa particolare funzione. Nessun'altra funzione può accedervi. Nel momento stesso in cui la funzione ritorna, il suo stack viene distrutto (non esattamente, ma è come se lo fosse).

Devi allocare la memoria nell'heap, prima di chiamare la funzione, passare il buffer, riempirlo e ritornare..

Potresti anche allocare "dentro" la funzione, ma è una pratica sbagliata e che sconsiglio caldamente, perchè genera facilmente numerosi memory leaks.

la soluzione migliore è:
Codice sorgente - presumibilmente C++

  1. /* Alloco la memoria */
  2. int * buffer = malloc(NUMERO_ELEMENTI * sizeof(int));
  3.  
  4. /* passo il buffer alla funzione, che lo modifica */
  5. print_array(buffer, a, b);
  6.  
  7. /* faccio il resto */
  8.  
  9. void print_array(int * buffer, int a, int b)
  10. {
  11.  /* tuo codice */
  12. }



Come mai è una pratica sbagliata? E' perchè rischia di far dimenticare al programmatore di liberare la memoria?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 11:03
Venerdì, 02/07/2010
@GuglielmoS: per alcuni motivi fondamentali...


1- Sarei vincolato al metodo di allocazione scelto da chi ha implementato quella particolare funzione. In un contesto generale potrei avere degli allocatori speciali (per ridurre ad esempio la frammentazione, attraverso tecniche di pooling), e quindi la flessibilità di allocare la memoria PRIMA di chiamare la funzione è fondamentale.

2- Una funzione che opera sui dati, deve operare sui dati. Una funzione che alloca memoria, alloca memoria e basta (al massimo la inizializza). Una funzione che opera sui dati E CHE alloca anche memoria, viola il basilare paradigma della programmazione strutturata (una singola funzione per ogni operazione elementare).

3- (conseguenza di #1 e #2) In un programma di grosse dimensioni, avrò a disposizione un Manager che si occuperà di enumerare le risorse, una Factory che si occuperà di allocare oggetti / riciclare quelli vecchi (tramite allocatori speciali ad esempio, v. #1), e un Model che si occuperà di operare sugli oggetti che gli passa il Manager, a sua volta generati dalla Factory. In questo modello complesso, l'allocazione della memoria è un processo gestito in modo centralizzato, mentre le operazioni sui dati possono essere le più disparate. Viene anche più semplice evitare i memory leaks, perchè TUTTE le allocazioni passano dalla Factory e vengono REGISTRATE dal Manager. Quindi per pulire il tutto basterà un for dentro il manager, che chiamerà un Factory_destroy(oggetto_corrente).

4- (evoluzione del #3) In un programma complesso, potrei voler delegare alcuni compiti a librerie esterne, gestite magari con un sistema di plugins. In questi casi il bisogno di avere funzionalità totalmente separate e ben definite, è di vitale importanza. Non vorrei mai che una libreria inclusa nel mio progetto generi delle allocazioni per i fatti suoi, quando magari nel mio progetto ho un allocatore particolare con reference counting, garbage collection e serializzazione integrata (per salvare lo stato del programma alla sua chiusura, ad esempio)...

my 4 cents :-D

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:14
Venerdì, 02/07/2010
:D c'è pure la traduzione in italiano di tutto quello che vi state dicendo??.. io non sono un programmatore esperto!.. mi sto solo esercitando per un esame!... comunque proverò a scrivere il sorgente di thekaneb e nel mentre se ho altri dubbi o errori vi disturbo :) grazie per l'aiuto!...

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 11:17
Venerdì, 02/07/2010
Testo quotato

Postato originariamente da giovybus:

:D c'è pure la traduzione in italiano di tutto quello che vi state dicendo??.. io non sono un programmatore esperto!.. mi sto solo esercitando per un esame!... comunque proverò a scrivere il sorgente di thekaneb e nel mentre se ho altri dubbi o errori vi disturbo :) grazie per l'aiuto!...



Tranquillo, sono cose che imparerai anche tu :-)
Non è niente di trascendentale, si tratta solo di qualche nozione base di ingegneria del software, software construction e design patterns. Tutto sarà chiaro a tempo debito :-)

PM Quote
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 11:22
Venerdì, 02/07/2010
Testo quotato

Postato originariamente da TheKaneB:

Testo quotato

Postato originariamente da giovybus:

:D c'è pure la traduzione in italiano di tutto quello che vi state dicendo??.. io non sono un programmatore esperto!.. mi sto solo esercitando per un esame!... comunque proverò a scrivere il sorgente di thekaneb e nel mentre se ho altri dubbi o errori vi disturbo :) grazie per l'aiuto!...



Tranquillo, sono cose che imparerai anche tu :-)
Non è niente di trascendentale, si tratta solo di qualche nozione base di ingegneria del software, software construction e design patterns. Tutto sarà chiaro a tempo debito :-)


Grazie per le delucidazioni molto esaustive e come sempre complete! :)
Sarebbe bello sentirle anche dai professori a scuola queste cose :(

Ultima modifica effettuata da GuglielmoS il 02/07/2010 alle 11:23
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 11:28
Venerdì, 02/07/2010
@GuglielmoS: se hai la fortuna di trovare un BRAVO professore di Ingegneria del software all'Uni, potrai approfondire al meglio questi argomenti. Altrimenti fai come me, leggi libri sul tema, scrivi progetti complessi, cerca di introdurti nel mondo del lavoro programmando su progetti con decine di programmatori esperti... solo così si possono raggiungere certi risultati :-)

Giusto per farti un esempio banale, fino a 5-6 anni fa, se dovevo scrivere più di 3000 righe di codice mi incartavo di brutto. Impiegavo anche più di un mese, e tra difetti dovuti all'errata gestione della memoria + scarsa organizzazione del codice + bug a quintali, finivo sempre per abbandonare i miei progetti.
Ma piano piano, grazie a letture come "Code Complete 2" (di Steve McConnell), esperienze lavorative in importanti software house, tanta dedizione e tanta pratica, adesso sono arrivato al punto di scrivere disinvoltamente 1000-1500 linee di codice al giorno, in modo ben strutturato, con pochissimi difetti e bug e senza nessun grattacapo. Una volta capito il meccanismo, diventa tutto moooolto più semplice, e puoi concentrarti unicamente sugli algoritmi, perchè tutto il contorno diventerà assolutamente automatico e naturale :-)

Bisogna soltanto studiare e fare tanta pratica, non conosco formule magiche :-)

Ultima modifica effettuata da TheKaneB il 02/07/2010 alle 11:30
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:34
Venerdì, 02/07/2010
Testo quotato


Grazie per le delucidazioni molto esaustive e come sempre complete! :)
Sarebbe bello sentirle anche dai professori a scuola queste cose :(



quoto!... io studio all'università e le cose non vengono spiegate in modo dettagliato...

Ultima modifica effettuata da il 02/07/2010 alle 11:35
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo