PDA

View Full Version : [c++] Alcuni dubbi


Sabonis
24-01-2008, 10:10
Se ho un codice di questo tipo:

Time *timePtr;
timePtr = new Time;
delete timePtr;
timePtr->funzionemembro();

ho visto che è possibile eseguire una funzione membro dopo avere cancellato l'oggetto con esiti imprevedibili, per evitare questo secondo voi è buona norma mettere 0 nel puntatore timePtr?
In questo modo intendo:

Time *timePtr;
timePtr = new Time;
delete timePtr;
timePtr = 0;
timePtr->funzionemembro();

In questo modo dovrei avere un segmentation fault e riuscirei ad accorgermi dell'errore.

Altra domanda: Se io mi dimentico di cancellare un oggetto un una qualsiasi cosa allocata tramite la new, quando chiudo il programma la memoria viene comunque liberata????

fek
24-01-2008, 10:34
Se ho un codice di questo tipo:

Time *timePtr;
timePtr = new Time;
delete timePtr;
timePtr->funzionemembro();

ho visto che è possibile eseguire una funzione membro dopo avere cancellato l'oggetto con esiti imprevedibili, per evitare questo secondo voi è buona norma mettere 0 nel puntatore timePtr?

Non farlo! E' un crimine di guerra.


In questo modo intendo:

Time *timePtr;
timePtr = new Time;
delete timePtr;
timePtr = 0;
timePtr->funzionemembro();

In questo modo dovrei avere un segmentation fault e riuscirei ad accorgermi dell'errore.

Ottima pratica.


Altra domanda: Se io mi dimentico di cancellare un oggetto un una qualsiasi cosa allocata tramite la new, quando chiudo il programma la memoria viene comunque liberata????

Si'.

Sabonis
24-01-2008, 11:05
grazie mille

71104
24-01-2008, 14:25
veramente in C++ dovresti ottenere segmentation fault solo se funzionemembro è virtuale.

Sabonis
25-01-2008, 09:58
veramente in C++ dovresti ottenere segmentation fault solo se funzionemembro è virtuale.
Ho fatto qualche esperimento, ottengo un segmentation fault se la funzione è virtuale oppure se accede a membri non statici della classe.

cdimauro
26-01-2008, 05:57
Altra domanda: Se io mi dimentico di cancellare un oggetto un una qualsiasi cosa allocata tramite la new, quando chiudo il programma la memoria viene comunque liberata????
Dipende dal compilatore e/o dal sistema operativo.

Ci sono s.o. che NON eseguono il tracking delle risorse (non soltanto memoria, ma anche file, lock, ecc.) allocate da un'applicazione (che, quindi, non vengono rilasciate alla fine della loro esecuzione), per cui questo compito in genere è demandato al compilatore o all'applicazione stessa.

Quindi se non se ne occupa il compilatore è necessario che lo faccia l'applicazione.

In generale cerca sempre di rilasciare le risorse che usi.