Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Cos'è la bolla dell'IA e perché se ne parla
Cos'è la bolla dell'IA e perché se ne parla
Si parla molto ultimamente di "bolla dell'intelligenza artificiale", ma non è sempre chiaro perché: l'IA è una tecnologia molto promettente e che ha già cambiato molte cose dentro e fuori le aziende, ma ci sono enormi aspettative che stanno gonfiando a dismisura i valori delle azioni e distorcendo il mercato. Il che, com'è facile intuire, può portare a una ripetizione della "bolla dotcom", e forse anche di quella dei mutui subprime. Vediamo perché
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-08-2010, 15:16   #1
Opcode
Member
 
L'Avatar di Opcode
 
Iscritto dal: Jun 2010
Città: Asti
Messaggi: 85
[C++] Da puntatore a reference.

Giorno,
stò pianificando dei metodi per restituire una reference degli oggetti della classe, invece di restituirne i puntatori per maggiore sicurezza ed evitare che possano essere cancellati, ho quindi un metodo tipo questo:
Codice:
Object &Classe::object()
{
    return *_object; // oggetto privato
}
Mi chiedevo, quello che restituisco è effettivamente una reference a _object oppure ne restituisco una copia?

_object ho dovuto dichiararlo come puntatore perchè la sua inizializzazione avviene in un metodo chiamato "init" e non nel costruttore di Classe.
Se volessi dichiarare in Classe:
Codice:
Classe {
public:
// ...
Object object;
};
Come potrei fare per catturare eventualmente le eccezioni del costruttore di Object?
object in quest'ultimo caso dovrebbe essere inizializzato nel costruttore di Classe giusto?
Se cosi fosse mi basterebbe dichiarare un blocco try catch nel costruttore e gestire l'eventuale eccezione... ma come?

Aspetto vostre notizie
Grazie in anticipo.
Opcode è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 19:01   #2
Wing_Zero
Bannato
 
L'Avatar di Wing_Zero
 
Iscritto dal: Oct 2002
Città: Vicino Fermo Mercatino:più di 100 trattative tutte OK
Messaggi: 4651
Allora innanzitutto l'oggetto "object" devi dichiararlo come variabile di classe, all'interno dell'header della classe e non crearlo all'interno del costruttore.
Altrimenti avresti uno scope locale al costruttore e non puoi restituirlo.

Poi quando lo restituisci: return *object, (se hai creato un puntatore ad object e "object" è l'indirizzo), altrimenti return object (se object è l'oggetto stesso).

nel caso vuoi instanziare l'oggetto all'interno del metodo stesso, devi scrivere
Object &Classe::object()
{
Object* object = new object();
return object;
}

in questo caso passi il riferimento e non la copia dell'oggetto, ma avendolo creato tramile la "new", l'oggetto viene allocato nello heap e non muore mai. neanche se distruggi il parent. Ti dovrai quindi ricordare di distruggerlo (" delete(object)" ) in seguito.

Cmq datti una letta a qualche libro per iniziare il C++...non ti puo' fare che bene.
Wing_Zero è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 19:20   #3
Opcode
Member
 
L'Avatar di Opcode
 
Iscritto dal: Jun 2010
Città: Asti
Messaggi: 85
Temo tu mi abbia frainteso.
Si object è un membro della classe, privato.
Nella dichiarazione della classe lo definisco come puntatore perchè la vera inizializzazione tramite new avviene non nel costruttore di Classe ma in un metodo chiamato "init".
Quello deve quindi essere il primo metodo, cosi crea l'oggetto nello heap e assegna al puntatore il suo indirizzo.
Ho però bisogno di restituire una reference, non una copia (non c'e n'è necessità) nè un puntatore, che potrebbe essere cancellato.

Il mio dubbio sorgeva dal fatto che sino ad oggi tutti gli esempi di funzioni che restituiscono una reference sono cosi strutturate:
Codice:
Object &Class::Reference()
{
    Object &ref = *_object; // object è un membro della classe
    return ref;
}
Mentre io per semplificare il tutto, e non trovando una necessità di rifare tutto faccio più semplicemente:
Codice:
Object &Class::Reference()
{
    return *_object;
}
Ovviamente il compilatore non mi dà ne warning, ne errori. Però il mio dubbio era che in realtà non facendo quel passaggio di creare io stesso un puntatore reference, fosse restituita una copia di _object, e il compilatore non segnala alcun errore pur non essendo una reale reference, tutto qui.
La seconda domanda invece era:
Se nella dichiarazione (non definizione) della classe anzichè mettere:
Codice:
Object *_object;
Da inizializzare poi nel metodo "init" mettessi più semplicemente
Codice:
Object _object;
In che modo posso catturare eventualmente una eccezione sollevata dal costruttore della classe Object?
IMHO è da fare nel costruttore della classe che dichiara l'oggetto _object, ma non essendo io a inizializzare l'oggetto ho qualche perplessità su come catturare quell'eccezione.

Se non sono stato chiaro, faccio un piccolo esempio.
Grazie per la risposta.
Opcode è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 19:52   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Wing_Zero Guarda i messaggi
Object &Classe::object()
{
Object* object = new object();
return object;
}
E chi lo dealloca object ???
Questo è un memory leak
Quote:
Originariamente inviato da Opcode Guarda i messaggi
Codice:
Object &Class::Reference()
{
    Object &ref = *_object; // object è un membro della classe
    return ref;
}
Mentre io per semplificare il tutto, e non trovando una necessità di rifare tutto faccio più semplicemente:
Codice:
Object &Class::Reference()
{
    return *_object;
}
Sono equivalenti
Quote:
Originariamente inviato da Opcode Guarda i messaggi
Come potrei fare per catturare eventualmente le eccezioni del costruttore di Object?
object in quest'ultimo caso dovrebbe essere inizializzato nel costruttore di Classe giusto?
Se cosi fosse mi basterebbe dichiarare un blocco try catch nel costruttore e gestire l'eventuale eccezione... ma come?
Spiega un po' meglio questo punto...

Ultima modifica di cionci : 06-08-2010 alle 19:55.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 20:35   #5
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Il codice che hai utilizzato va benissimo, e non ritorna una copia, non ti preoccupare

Per la seconda domanda, hai bisogno di un "function try block", cioè di associare il try non ad un blocco ma all'intera funzione:
Codice:
MyClass::MyClass()
try : object() {
    //Corpo del costruttore
}
catch (myObjectException &e){
    //Gestione dell'eccezione
}
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 20:40   #6
Opcode
Member
 
L'Avatar di Opcode
 
Iscritto dal: Jun 2010
Città: Asti
Messaggi: 85
Quote:
Originariamente inviato da cionci Guarda i messaggi
Sono equivalenti
Ooottimo Era quello che mi serviva sapere, ho cercato più volte ma, probabilmente a scopo didattico, il risultato era simile in tutti i casi.
Quote:
Spiega un po' meglio questo punto...
Allora, supponiamo che io ho la seguente classe:
Codice:
class Window {
public:
    Window() { throw 1; } // supponiamo una eccezione
};

class Handler {
public:
    Handler() {};
    Window window; // (1) -- alla costruzione lancerà un'eccezione
};
(1) Come catturo l'eccezione sollevata dal costruttore di Window?

Se avessi un puntatore, farei tipo:
Codice:
// Window *window; // dichiarato precedentemente
Handler::Handler() {
    try {
        window = new Window;
    }
    catch (Exception &ex) {
        // gestisci
    }
}
Ma in quel caso l'oggetto viene creato automaticamente dal costruttore di Handler quindi come faccio a cattuare l'eccezione di Window::Window?

Quote:
Originariamente inviato da Albi89 Guarda i messaggi
Il codice che hai utilizzato va benissimo, e non ritorna una copia, non ti preoccupare
ottimo.
Quote:
Per la seconda domanda, hai bisogno di un "function try block", cioè di associare il try non ad un blocco ma all'intera funzione:
Codice:
MyClass::MyClass()
try : object() {
    //Corpo del costruttore
}
catch (myObjectException &e){
    //Gestione dell'eccezione
}
Eccolo qui, benissimo, ero indeciso se questo metodo avrebbe funzionato o meno, e comunque preferisco sempre avere un feedback per non fare qualche cacchiata.

Se io non inizializzo esplicitamente object() ? Funzionerà ugualmente?
Grazie mille per la risposta

Ultima modifica di Opcode : 06-08-2010 alle 20:45.
Opcode è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 21:18   #7
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da Opcode Guarda i messaggi
Se io non inizializzo esplicitamente object() ? Funzionerà ugualmente?
Grazie mille per la risposta
Onestamente penso di sì ma non ci giurerei... meriterebbe una prova ma in questo momento confesso di aver bootato in Windows per giocare a Dragon Age e non ho nulla installato per provare

"A rigore" dovrebbe funzionare, nell'indecisione comunque aggiungere la chiamata al costruttore non costa molto e rende più chiaro "da chi" ti aspetti un'eccezione.

Un problema più interessante è che, quando si associa un "function try block" ad un costruttore, al termine del blocco catch, se questi non ha propagato l'eccezione ricevuta (o non ne ha lanciata una nuova), l'eccezione originaria è comunque propagata: in soldoni, quando fallisce il costruttore di una sottoparte, deve fallire il costruttore dell'intero oggetto -quindi ricordati di avere un blocco try associato alla costruzione di MyClass, e possibilmente lancia una eccezione "ad hoc" nel blocco catch!-.

Una questione simile dovrebbe valere anche per i distruttori, anche se ha implicazioni meno significative (una eccezione in un distruttore dovrebbe sempre terminare il programma, e in generale il codice di un distruttore è meno propenso a fallire).
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 22:12   #8
Wing_Zero
Bannato
 
L'Avatar di Wing_Zero
 
Iscritto dal: Oct 2002
Città: Vicino Fermo Mercatino:più di 100 trattative tutte OK
Messaggi: 4651
Quote:
Originariamente inviato da cionci Guarda i messaggi
E chi lo dealloca object ???
Questo è un memory leak

Sono equivalenti

Spiega un po' meglio questo punto...
come chi lo dealloca?
passi il rifermimento all'oggetto,e poi delete(object)
Wing_Zero è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 22:16   #9
Opcode
Member
 
L'Avatar di Opcode
 
Iscritto dal: Jun 2010
Città: Asti
Messaggi: 85
Confermo che funziona
Comunque si, per maggiore chiarezza lo inizializzerò esplicitamente.
Quote:
Originariamente inviato da Albi89 Guarda i messaggi
Un problema più interessante è che, quando si associa un "function try block" ad un costruttore, al termine del blocco catch, se questi non ha propagato l'eccezione ricevuta (o non ne ha lanciata una nuova), l'eccezione originaria è comunque propagata: in soldoni, quando fallisce il costruttore di una sottoparte, deve fallire il costruttore dell'intero oggetto -quindi ricordati di avere un blocco try associato alla costruzione di MyClass, e possibilmente lancia una eccezione "ad hoc" nel blocco catch!-.

Hai fatto benissimo a dirmelo, non ne ero a conoscenza.
Sapevo invece che se c'è un problema nel costruttore e hai allocato qualche risorsa, l'eccezione non chiama il distruttore perchè l'oggetto non è stato creato, e quindi ci vuole attenzione.

Riguardo a questo problema, ti giro una nuova domanda:
e se MyClass fosse un singleton?

La classe viene inizializzata staticamente, come potrebbe gesitre il throw del proprio costruttore?

Quote:
Una questione simile dovrebbe valere anche per i distruttori, anche se ha implicazioni meno significative (una eccezione in un distruttore dovrebbe sempre terminare il programma, e in generale il codice di un distruttore è meno propenso a fallire).
Uhm, farò qualche test anche sui distruttori, per vedere un po' che succede nei casi peggiori.

Grazie.
Opcode è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 22:26   #10
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Wing_Zero Guarda i messaggi
come chi lo dealloca?
passi il rifermimento all'oggetto,e poi delete(object)
Per me è da pazzi pensare di deallocare un riferimento (comunque eventualmente delete &object; ). Scusa la franchezza.
Anche perchè poi tutti gli eventuali riferimenti avrebbero un comportamento indefinito, il crash del programma è assicurato.
Infine chi ti dice che l'oggetto a cui punta il riferimento è stato allocato con una new?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 22:44   #11
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da Wing_Zero Guarda i messaggi
come chi lo dealloca?
passi il rifermimento all'oggetto,e poi delete(object)
Allocazione è deallocazione vanno SEMPRE svolte allo stesso livello di "astrazione": allocare all'interno di una classe e lasciare la responsabilità della deallocazione all'utente è una pratica da evitare assolutamente; al massimo si può ritornare un oggetto gestore che deallochi il riferimento quando out of scope.
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 22:45   #12
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Infine chi ti dice che l'oggetto a cui punta il riferimento è stato allocato con una new?
chi ti dice che lo sia quello gestito tramite puntatore?
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 22:58   #13
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da Opcode Guarda i messaggi
Riguardo a questo problema, ti giro una nuova domanda:
e se MyClass fosse un singleton?
A livello tecnico non dovrebbe cambiare niente; posto Instance() il metodo mediante il quale richiedi l'istanza e _instance l'istanza membro, dovresti probabilmente fare qualcosa di simile:
Codice:
MySingleton* MySingleton::Instance() {
    if (_instance == 0) {
        try {
            _instance = new MySingleton();
        }
        catch (mySingletonConstructionException) {
            //...
            throw;
        }
    }
    return _instance;
}
Cioè un approccio tradizionale (senza function try block), ma avendo cautela di far comportare la clausola catch come quella associata a un costruttore (cioè propagando l'eccezione: d'altra parte quella parte del metodo Instance() è deputata alla costruzione è in caso di fallimento non ha mai senso ritornare il puntatore all'istanza).

Ovviamente, il costruttore MySingleton::MySingleton() può avere o non avere un function try block associato: lo avrà se inizializza altri oggetti (cioè se eredita da altre classi o se inizializza membri con una sintassi constructor initializer, ossia i fatidici ":"), altrimenti conterrà semplicemente uno statement try.
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 06-08-2010, 23:44   #14
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da fero86 Guarda i messaggi
chi ti dice che lo sia quello gestito tramite puntatore?
Infatti utilizzi il riferimento e non hai più dubbi su chi deve gestire la vita dell'oggetto.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2010, 01:44   #15
Wing_Zero
Bannato
 
L'Avatar di Wing_Zero
 
Iscritto dal: Oct 2002
Città: Vicino Fermo Mercatino:più di 100 trattative tutte OK
Messaggi: 4651
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Per me è da pazzi pensare di deallocare un riferimento (comunque eventualmente delete &object; ). Scusa la franchezza.
Anche perchè poi tutti gli eventuali riferimenti avrebbero un comportamento indefinito, il crash del programma è assicurato.
Infine chi ti dice che l'oggetto a cui punta il riferimento è stato allocato con una new?
Deallocando un riferenmento (Comunque delete object e non &object, in quanto avevo specificato che object era l'indirizzo e *object l'oggetto) devi sape a priori che è stato allocato con una new. altrimenti non avrebbe senso deallocarlo tamire un riferimento se la variabile fosse temporanea nello stack e non nell'heap. mi pare ovvio.
Quote:
Originariamente inviato da Albi89 Guarda i messaggi
Allocazione è deallocazione vanno SEMPRE svolte allo stesso livello di "astrazione": allocare all'interno di una classe e lasciare la responsabilità della deallocazione all'utente è una pratica da evitare assolutamente; al massimo si può ritornare un oggetto gestore che deallochi il riferimento quando out of scope.
Concordo che non è la pratica migliore in assoluto, ma a volte non si puo' evitare.
Wing_Zero è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2010, 07:28   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Wing_Zero Guarda i messaggi
Deallocando un riferenmento (Comunque delete object e non &object, in quanto avevo specificato che object era l'indirizzo e *object l'oggetto) devi sape a priori che è stato allocato con una new. altrimenti non avrebbe senso deallocarlo tamire un riferimento se la variabile fosse temporanea nello stack e non nell'heap. mi pare ovvio.
object è un puntatore ? Quindi addirittura torno un puntatore allocato con malloc ritornato per riferimento ?
A questo punto le domande sono tre:
- chi dealloca il puntatore
- chi dealloca la memoria puntata dal puntatore
- che tipo di deallocazione va fatta ? una delete o una delete[] sui dati ? Chi ti garantisce che la venga fatta quella giusta ?
Quote:
Originariamente inviato da Wing_Zero Guarda i messaggi
Concordo che non è la pratica migliore in assoluto, ma a volte non si puo' evitare.
Imho va semplicemente evitata. Se si è costretti ad usarla significa che bisogna fare un refactoring del nostro codice.

Ultima modifica di cionci : 07-08-2010 alle 07:40.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2010, 16:25   #17
Opcode
Member
 
L'Avatar di Opcode
 
Iscritto dal: Jun 2010
Città: Asti
Messaggi: 85
Quindi il controllo delle eccezioni mi forza ad usare un puntatore come singleton, cioè se io volessi fare qualcosa come:

Codice:
Class MySingleton {
private:
    static MySingleton _instance;
    MySingleton() {};
    MySingleton(const MySingleton&); //disabilito il copy constructor
public:
    static MySingleton &instance() { return _instance; }
};
// inizializzo il singleton
MySingleton MySingleton::_instance; // (1)
Mi chiedevo se fosse quindi possibile intercettare l'eccezione nel punto (1) essendo in ambito globale. Ovviamente qualora non fosse possibile procederei come hai descritto tu, ma sempre restituendo una reference per evitare il delete.

Quote:
Originariamente inviato da Albi89 Guarda i messaggi
Cioè un approccio tradizionale (senza function try block), ma avendo cautela di far comportare la clausola catch come quella associata a un costruttore (cioè propagando l'eccezione: d'altra parte quella parte del metodo Instance() è deputata alla costruzione è in caso di fallimento non ha mai senso ritornare il puntatore all'istanza).
Beh se fallisce la creazione del singleton non sarebbe opportuno terminare l'esecuzione del programma con uno status di errore? Sempre supponendo che il singleton non venga creato attraverso un'altro oggetto, altrimenti si potrebbe sollevare l'eccezione e riprovare a crearlo.

EDIT: ora che ci ripenso forse una soluzione c'è. Se non erro in mancanza di un handler per l'eccezione viene chiamato terminate() dalla <exception>, quindi se io gestissi in quel punto l'eccezione eventualmente generata, dovrebbe funzionare quanto meno per evitare un crash perchè non ho gestito l'eccezione, non credi? Io intanto faccio qualche test
Scherzavo, non posso cattuare l'eccezione

Ultima modifica di Opcode : 07-08-2010 alle 18:41.
Opcode è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2010, 19:00   #18
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Wing_Zero Guarda i messaggi
come chi lo dealloca?
passi il rifermimento all'oggetto,e poi delete(object)
Pessima idea. Quando un oggetto viene ritornato per riferimento l'assunzione implicita e' che chi te la fornito ne mantiene comunque la patria potesta'.
Un po' come un bambino che ti presta il pallone per giocarci a calcio assieme. Pui fare quello che vuoi, ma non puoi portartelo via, e quando se ne va l'altro, il pallone sparisce assieme a lui.
Per motivi analoghi non dovresti prenderne il puntatore e salvarlo da altre parti, salvo rare eccezioni.

(Discorso analogo si potrebbe fare per gli argomenti passati per riferimento, che in generale non si puo' pensare abbiano vita maggiore della chiamata stessa )
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2010, 19:08   #19
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Albi89 Guarda i messaggi
Allocazione è deallocazione vanno SEMPRE svolte allo stesso livello di "astrazione": allocare all'interno di una classe e lasciare la
responsabilità della deallocazione all'utente è una pratica da evitare assolutamente;
Direi piuttosto che e' importante che sia chiaro chi e' il proprietario dell'oggetto ritornato.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2010, 19:19   #20
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Albi89 Guarda i messaggi

Un problema più interessante è che, quando si associa un "function try block" ad un costruttore, al termine del blocco catch, se questi non ha propagato l'eccezione ricevuta (o non ne ha lanciata una nuova), l'eccezione originaria è comunque propagata: in soldoni, quando fallisce il costruttore di una sottoparte, deve fallire il costruttore dell'intero oggetto -quindi ricordati di avere un blocco try associato alla costruzione di MyClass, e possibilmente lancia una eccezione "ad hoc" nel blocco catch!-.
Starei attento a lanciare eccezioni nei costruttori. Il primo problema e' che devi fare pulizia di quanto hai gia' inizializzato. Il secondo, ben piu' importante, e' che devi farlo in ogni oggetto che usi una istanza di questa classe come attributo.
Ci si puo' stare attenti ma e' un sacco di lavoro

Quote:
Una questione simile dovrebbe valere anche per i distruttori, anche se ha implicazioni meno significative (una eccezione in un distruttore dovrebbe sempre terminare il programma, e in generale il codice di un distruttore è meno propenso a fallire).
Un'eccezione in un distruttore e' una ricetta sicura per il disastro, visto che ti puoi trovare in situazioni in cui viene lanciata un'eccezione durante lo stack unwinding.
Direi meglio evitare.
(e se invece l'oggetto era garbage collected che senso ha ?)
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
FRITZ!Repeater 1700 estende la rete super-veloce Wi-Fi 7 FRITZ!Repeater 1700 estende la rete super-veloce...
Cloud sovrano: l'approccio di Broadcom c...
HONOR conferma l'arrivo in Italia di Mag...
La Cina sotto pressione impone maniglie ...
OpenAI integra le app in ChatGPT per tra...
NVIDIA sarebbe pronta a tagliare la prod...
Prezzo minimo storico per iPhone 16 Pro:...
Riot Games scopre una falla nei BIOS che...
Beats in super offerta su Amazon: aurico...
Batterie elettriche, Samsung SDI e Stell...
Clivet presenta Fullness, la pompa di ca...
SpaceX lancerà 167 razzi spaziali...
Yakuza Kiwami 3 e Dark Ties protagonisti...
Privacy a rischio: ecco la VPN che regis...
SpaceX ha annunciato che un satellite St...
ASUSTOR presenta i nuovi NAS Lockerstor ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:51.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v