Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Non riesco a far zittire il compilatore da questo warning...
Questo è la mia funzine!
Codice sorgente - presumibilmente C++
int*
print_array(int a, int b){
int array[5];
......... /*operazioni*/
return&array;/*in questa riga mi da warning*/
}
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.
Non riesco a far zittire il compilatore da questo warning...
Questo è la mia funzine!
Codice sorgente - presumibilmente C++
int*
print_array(int a, int b){
int array[5];
......... /*operazioni*/
return&array;/*in questa riga mi da warning*/
}
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.
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
()
Newbie
Messaggi: Iscritto:
Postato alle 11:14
Venerdì, 02/07/2010
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!...
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 :-)
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
@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
()
Newbie
Messaggi: Iscritto:
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