Distruttore (informatica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
fix php +c#
m Linguaggi garbage collected: Eliminato una d cacofonica
 
(37 versioni intermedie di 26 utenti non mostrate)
Riga 1:
{{F|programmazione|febbraio 2013}}
{{Nota disambigua|l'imbarcazione militare|[[cacciatorpediniere]]}}
{{C|Come la voce sul costruttore, contiene imprecisioni ed elementi C++-centrici. Non è propriamente vero che il distruttore ha "lo scopo" di liberare risorse; non in tutti i modelli viene considerato "un metodo"; che debba essere necessariamente pubblico è sicuramente affermazione legata a qualche particolare linguaggio, ecc. Vedere la voce di en|informatica|giugno 2010}}
{{WIP|Fede_Reghe}}
I '''distruttori''', in [[informatica]] e specificamente nella [[programmazione orientata agli oggetti]], sono degli eventi particolari che vengono invocati automaticamente quando l'[[Oggetto (informatica)|oggetto]] viene distrutto.<br />
{{s|informatica}}
NellaSono [[programmazione orientata agli oggetti]], un '''distruttore''' è un particolare metodo che viene invocato automaticamente quando l'[[Oggetto (informatica)|oggetto]] viene distrutto. E' statostati concepitoconcepiti per liberare le risorse utilizzate dall'oggetto, definite dalla sualoro classe e create dal corrispondente [[Costruttore_costruttore (oggettiinformatica)|costruttore]] ed eventualmente le altre risorse allocate dinamicamente durante l'esecuzione dei metodi dell'oggetto stesso.
 
== Uso ==
Nella creazione del codice di un distruttore occorre agire con particolare attenzione, in quanto per evitare fenomeni di ''[[memory leak]]'' si deve essere certi che tutte le [[strutture dati]] liberino correttamente la memoria da loro utilizzata compresa quella eventualmente utilizzata da altre strutture annidate al loro interno.
 
Il distruttore, a differenza del [[costruttore (informatica)|costruttore]], non può accettare nessun tipo di parametro, perché se non chiamato esplicitamente, sarà il compilatore a inserire a fine programma la chiamata al costruttoredistruttore. Per questo motivo, per ogni classe può esserci un solo distruttore, rendendo impossibile l'''[[overloading]]''.
 
'''E'Non è obbligatorio che un distruttore sia dichiarato <code>public.</code> L'''esempio:
<syntaxhighlight lang="cpp" line="1">
class A {int i;
~A() {}
public: A(int v) {i=v;}
};
 
int main(int argc, char* argv[])
=== Linguaggi garbage collector ===
{
Nei linguaggi che mettono a disposizione un [[Garbage collection|garbage collector]], il distruttore è spesso inutile in quanto le risorse occupate da un oggetto vengono automaticamente liberate nel momento in cui non c'è più nessun riferimento all'oggetto stesso. In questi linguaggi è generalmente possibile utilizzare o definire ugualmente appositi metodi per ottenere il medesimo effetto, nei casi in cui si desideri disattivare il garbage collector, in quanto per alcuni task critici potrebbe risultare troppo inefficiente. Esempio di linguaggi di programmazione fra i più conosciuti ad utilizzare il meccanismo della garbage collection sono [[Java (linguaggio)|Java]] e la versione 2 di [[Objective-C]].
A *a = new A(2); // ok
// A b(1); <----- non ammesso perché il distruttore è privato (error C2248: 'A::~A' : cannot access private member declared in class 'A')
}
</syntaxhighlight>
 
compila perfettamente ma impedisce che un oggetto di classe A venga istanziato sullo stack ma consente che venga istanziato sullo ''[[Heap (gestione della memoria)|heap]]''. È ovvio tuttavia che un metodo di distruzione debba essere fornito all'utente il quale, a questo punto, può accettare anche dei parametri e tornare dei valori.
Esempio:
<syntaxhighlight lang="cpp" line="1">
class A {int i;
static int count;
~A () {}
public: A (int v){i=v; count++;}
static bool Delete (A *a) {if (!count) return false; count--; delete a; return true;}
};
int A::count = 0;
 
int main(int argc, char* argv[])
{
A *a = new A(2);
bool b = A::Delete (a);// b=1
b = A::Delete (a); // b=0
}
</syntaxhighlight>
 
=== Linguaggi ''garbage collectorcollected'' ===
Nei linguaggi che mettono a disposizione un ''[[Garbage collection|garbage collector]]'', il distruttore è spesso inutile in quanto le risorse occupate da un oggetto vengono automaticamente liberate nel momento in cui non c'è più nessun riferimento all'oggetto stesso. In questi linguaggi è generalmente possibile utilizzare o definire ugualmente appositi metodi per ottenere il medesimo effetto, nei casi in cui si desideri disattivare il garbage collector, in quanto per alcuni task critici potrebbe risultare troppo inefficiente. Esempio di linguaggi di programmazione fra i più conosciuti ada utilizzare il meccanismo della ''garbage collection'' sono [[Java (linguaggio di programmazione)|Java]] e la versione 2 di [[Objective-C]].
 
== Linguaggi di programmazione ==
=== [[C++]] ===
 
<source lang="cpp">
In C++ l'implementazione esplicita del distruttore è solitamente necessaria nell'implementazione di classi che gestiscono risorse. In accordo alla [[regola del tre (C++)|regola del tre]], solitamente l'implementazione del distruttore è accompagnata dall'implementazione di un [[costruttore di copia]] e di un [[operatore di assegnamento]].
 
<syntaxhighlight lang="cpp" line="1">
class Point
{
Riga 27 ⟶ 61:
int y;
}
</syntaxhighlight>
</source>
 
=== [[C#]] ===
'''Questo linguaggio possiede il [[''garbage collection]]'' rendendo poco usati i distruttori'''
<sourcesyntaxhighlight lang="csharp" line="1">
public class Punto
{
Riga 40 ⟶ 74:
}
}
</syntaxhighlight>
</source>
 
=== [[PHP]] ===
==== [[PHP]] 4 ====
Nella versione 4 (e precedenti) di PHP non esisteva il [[distruttore]]. Era presente una semplice gestione degli oggetti con l'uso dei [[costruttoreCostruttore (informatica)|costruttori]].
 
==== [[PHP]] 5 ====
Nella versione 5 il nome della funzione deve essere ''<code>__destructor''()</code>.
<sourcesyntaxhighlight lang="php">
class Point
{
private $x;;
private $y;
public function __destructor ( )
Riga 57 ⟶ 92:
}
}
</syntaxhighlight>
</source>
 
== Voci correlate ==
*[[Costruttore (informatica)|Costruttore]]
*[[Categoria:Programmazione adorientata agli oggetti]]
 
== Collegamenti esterni ==
* {{FOLDOC|destructor|destructor}}
 
{{sportale|informatica}}
[[Categoria:Programmazione ad oggetti]]
 
[[Categoria:Programmazione]]
[[en:Destructor_(computer_science)]]
[[Categoria:Programmazione orientata agli oggetti]]