PDA

Visualizza la versione completa : [c++] Operatore Delete


madmax84
11-02-2004, 18:05
Se ho il seguente programma

int main(){
int* p= new int;
*p = 10;
delete p; // ok marca come libera la zona usata da p e la rende
// riallocabile

delete p //ERRORE

}

perchŔ c'Ŕ errore se faccio la seconda delete? forse perchŔ mi rende libera una zona giÓ libera e per questo la zona puo essere puntata da due puntatori?

Sergio Pedone
11-02-2004, 18:10
Provo a risponderti io:
new e delete consentono l'allocazione dinamica della memoria.
Una volta che crei il puntatore ad interi con new, deallochi la memoria occupata con delete, il ciclo vitale del puntatore p Ŕ terminato. Un'ulteriore tentativo di 'deletarlo' viene segnalato dal compilatore.

Ciao.

madmax84
11-02-2004, 18:13
si ma perchŔ ho un errore ?in che cosa consiste questo errore? inoltre l'errore Ŕ segnalato a compile time o a run time?


:confused:

Sergio Pedone
11-02-2004, 18:22
//prova.cpp

int main()
{
int* p = new int;
*p = 10;
delete p;
delete p;
return 0;
}


Non ho ottenuto alcun errore sia in fase di compilazione che di esecuzione. Mi sarei aspettato una segnalazione dal compilatore. :(

Michele Facchin
11-02-2004, 18:22
Lo hai capito da solo.

Tu la seconda volta deallochi una cosa non allocata.



forse perchŔ mi rende libera una zona giÓ libera e per questo la zona puo essere puntata da due puntatori?




int main (void) {
int *p, *p2;
p = new int;
p2 = p;
*p = 10;
delete p2;
return (0);
}

E' la stessa cosa..con due puntatori.

madmax84
11-02-2004, 18:25
quindi l'errore sta nel fatto che derallocouna cosa che non ho allocato. ok



grazie mad :ciauz:

Sergio Pedone
11-02-2004, 18:35
Riporto ancora una cosa:
[code]
g++ -o prova.o prova.cpp
nessun errore, neanche in esecuzione.

gcc -o prova.o prova.cpp
/tmp/cco0iFc7.o(.text+0x16): In function `main':
: undefined reference to `operator new(unsigned)'
/tmp/cco0iFc7.o(.text+0x30): In function `main':
: undefined reference to `operator delete(void*)'
/tmp/cco0iFc7.o(.text+0x3e): In function `main':
: undefined reference to `operator delete(void*)'
/tmp/cco0iFc7.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
[code]

:confused:

Sto C pi¨ pi¨ mi spacca in 2 la testa.

internet
11-02-2004, 18:57
gcc usa il linker del C
mentre g++ passa al linker anche le librerie standard C++

prima bastava inserire l'opzione al linker -lstdcxx
e funzionava, ora con la versione 3 non va pi¨.

Sergio Pedone
11-02-2004, 21:15
In effetti uso gcc3.2.3, ma il vero problema per me Ŕ seguire le indicazioni di un testo, poi arrivare a mettere le mani sulla tastiera e ritrovarsi in un mare di errori e/o risultati inaspettati (come quello di cui sopra).

Grazie per le indicazioni, ciao.

Loading