Newsgroup: it.comp.lang.c++
Titolo: Problema con delete

Se a delete passo un puntatore a void* il puntatore mi distrugge il dato
inserito (aionando anche la relatica funzione di distruzione se è)?
Oppure mi da' errore?
    Ciao gabry

 Oppure mi da' errore?
La seconda che hai detto.
Se vuoi cancellare un oggetto il cui vero tipo a run-time e` X,
usando pero` un puntatore a Y che e` una classe base di X,
puoi farlo _a patto che_ Y abbia un _distruttore virtuale_.
Ma 'void' non e` una classe base, ne` ha distruttori...
Alex

 puoi farlo _a patto che_ Y abbia un _distruttore virtuale_.
E questo, mi permetto di aggiungere, "costringe" a definire sempre e
comunque un distruttore virtuale per "sicurezza", in modo che venga comunque
richiamato il distruttore della classe derivata anche se distruggi da un
puntatore a classe base.
Bye
-----
Giovanni Bajo
Lead Programmer
Prograph Research S.r.l.
http://www.prograph.it

 puntatore a classe base.
"Sempre e comunque" e`, ovviamente, una clamorosa "surlicita"!
Il distruttore virtuale per una classe Y deve essere definito tutte e 
sole le volte che si vuole (o si deve) permettere al codice-cliente di:
    -- derivare da Y una sua classe X
    -- usare delete su di un Y* (che puo` in realta` puntare a un X)
Molte classi sono fatte per *non* essere create con new e distrutte
con delete (il codice cliente deve invece usare altri protocolli, come
funzioni-fabbrica e funzioni-dispose); in questo caso, esse di regola
avranno operator new e operator delete come private, e quindi non
vi e` alcun rischio che un delete possa essere applicato da codice
cliente ad un puntatore a una istanza di una tale classe.  Quindi,
nessun bisogno 'intrinseco' che esse abbiano distruttore virtuale.
Molte classi NON sono fatte allo scopo di permettere derivazione; il
segno tipico e` che esse non hanno _nessun_ metodo virtuale.  Anche
in questi casi, inserire un distruttore virtuale (che in questo solo
caso si pagherebbe caro, rendendo polimorfico un oggetto che se
no non lo sarebbe) non e` affatto indispensabile (verificare ad esempio
nella libreria standard se std::ifstream o std::string lo abbiano...:-).
Riassumendo, dunque, una ragionevole regola puo` essere:
    -- se una classe ha 1+ metodi virtuali, _E_ non definisce
        operator delete in modo protetto, allora probabilmente
        va ritenuto "obbligatorio" che abbia virtuale anche il dtor.
Alex

         va ritenuto "obbligatorio" che abbia virtuale anche il dtor.
Ottimo, cosě mi sembra perfetto.
Ciao


 "Sempre e comunque" e`, ovviamente, una clamorosa "surlicita"!
Tra l'altro (e scusa se posto ancora, ma mi ero dimenticato), anch'io in
effetti lo uso solo quando inizio a derivare...


 "Sempre e comunque" e`, ovviamente, una clamorosa "surlicita"!
Ma che significa quest'ultima parola? Non è italiano, vero? Sul
vocabolario non l'ho trovata.
EMG


E' un termine del bridge: indica quando uno chiama (ovvero si impegna a
fare) un numero di prese superiore a quanto puo' ragionevolmente sperare
di fare. Si puo' intendere come "prendersi un impegno esagerato, al di
la' delle proprie possibilita'/necessita'"
Ciao,
Nicola

 vocabolario non l'ho trovata.
Se non lo e`, chiedo scusa, pensavo che lo fosse (e` sicuramente
in uso comune in un certo ambiente, ma non e` detto che cio`
significhi che e` accolta in italiano).
Una "licita" e` una "offerta fatta ad un'asta", e "sottolicita" e
"surlicita" significano rispettivamente "offerta troppo bassa" e
"offerta troppo alta" (a seconda del contesto, il 'troppo' puo`
essere, "rispetto al vero valore", "rispetto a quanto il licitatore
e` effettivamente disposto a pagare", ecc).
Oltre che nel mondo delle aste, i termini sono comuni nel
gioco del bridge (che inizia con una dichiarazione, o "asta").
L'uso metaforico di "sottolicita" come equivalente dell'inglese
"understatement" (che non saprei come altro tradurre in
italiano) e` comune negli stessi ambienti:
    Pippo: "Alex a volte appare un po' sicuro di se`..."
    Pluto: "Direi che e` una sottolicita!"
L'analogo uso metaforico di "surlicita" come "overstatement"
(che si puo` anche tradurre "esagerazione") e` meno comune
ma non inaudito.
Alex