Condividi:        

Tipi enumerativi in c++

Discussioni e opinioni costruttive sul mondo dell'informatica.
Per la soluzione di problemi specifici fare riferimento alle sezioni di assistenza!

Moderatori: aurelio37, Anthony47, axelrox

Postdi pjfry » 12/04/03 17:04

rayden scusa c'è una cosa che non mi ricordo : se usi solo il puntatore, quando viene allocata la memoria per giorno?? non serve almeno una new? oppure mi sbaglio con il c? :-?
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Sponsor
 

Postdi rayden » 13/04/03 14:44

normalmente io lo uso solo per classi che creo io la dove didefinisco l'operatore... quando l'operatore new è standard si può anche omettere, altrimenti se lo si è ridefinito e si deve usare quello originale vanno usari i risolutori di visibilità... a tua discrezione e uso insomma...
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi pjfry » 13/04/03 15:37

ah ecco, allora mi sbagliavo proprio con il C in cui se fai una cosa del genere ti dà errore perchè la memoria non è allocata
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Postdi zello » 13/04/03 20:47

rayden scusa c'è una cosa che non mi ricordo : se usi solo il puntatore, quando viene allocata la memoria per giorno??

Codice: Seleziona tutto
char* giorno;
switch (settpass)
{

case 0:
giorno = "lun";
break;
[snip]

Scusa, rispondo io: giorno viene fatto puntare allo "string literal" lun, che è piazzato dal compilatore nel codice (nel segmento dati, in effetti). Non c'è bisogno di allocare ulteriore memoria - anche perché, se lo facessi, dovrei ricordarmi di deallocarla, e tenere puntatori "liberi" in C++ è una cosa da fare con prudenza, a causa eccezioni:
Codice: Seleziona tutto
int dummy()
{
   int* n=new int(1);
   int p=*n/(*n-1); //bang, division by zero - eccezione
   delete n;   //questa non viene eseguita
   return p;
}

int main()
{
    try
    {
       cout<<dummy()<<endl;
    }
   catch(...){}
    return 0;
}

Nella pratica: l'eccezione fa "saltare" l'esecuzione di delete n, e tu perdi allegramente memoria.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Postdi pjfry » 13/04/03 23:24

grazie zello, 2 domande (andrea87 non se la prenderà se mi approprio del topic, spero ;) ):
1)non ho ben capito se lo 'string literal' di cui parli c'entra qualcosa con il tipo enumerato definito prima, suppongo di no date le virgolette " "
2)nel tuo esempio la memoria non viene deallocata se esci per l'eccezione, ma se la funzione finisce regolarmente serve il delete? non viene buttato tutto ciò che è stato dichiarato nella funzione quando questa finisce?
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Postdi zello » 14/04/03 14:57

1) uno "string literal" è una stringa definita nel programma. In un caso come questo
Codice: Seleziona tutto
const char* lit="Hello world";

"Hello world" è uno string literal. In C, il tipo implicito di uno string literal è char*. In C++, il tipo implicito è const char* (è brutto modificare una stringa costante, non un buono stile di programmazione), ma per motivi di compatibilità, per il momento, è previsto un cast implicito a char* (è un'eccezione rispetto alle regole standard del casting, ed è deprecata dallo stesso comitato di standardizzazione).
2) Viene buttato il valore del puntatore, non il contenuto. In altri termini, la regola è questa:
- ogni variabile il cui spazio è allocato con malloc/calloc va disallocata con free.
- ogni variabile allocata con new va disallocata con delete.

Per dirti:
Codice: Seleziona tutto
void dummy(int a)
{
    int* pInt=& //ok, non va distrutta con delete o free
    int b=a*2;    // ok, non va distrutta con delete o free
    int* pInt2=&b // ok, non va distrutta con delete o free
    int* pInt3=new int(a); //da distruggersi!!
    int* pInt4=pInt3;        //ma ovviamente solo una volta!!
    delete pInt3;
}

Spero sia un po' più chiaro.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Postdi pjfry » 14/04/03 17:53

molto + chiaro,grazie... soprattutto è chiaro che devo ristudiarmi un pò il c++ perchè c'è un sacco di roba che non mi ricordo :neutral:
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Precedente

Torna a Discussioni


Topic correlati a "Tipi enumerativi in c++":


Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti