Comportamento di malloc con delete in C ++

int *p=(int * )malloc(sizeof(int)); delete p; 

Quando allochiamo memoria usando malloc, dovremmo rilasciarlo usando free e quando lo allociamo usando new in C ++ dovremmo rilasciarlo usando delete.

Ma se assegniamo memoria usando malloc e poi usiamo delete, allora dovrebbe esserci qualche errore. Ma nel codice precedente non ci sono errori o avvertimenti in arrivo in C ++.

Inoltre, se invertiamo e assegniamo usando new e release usando free, allora non ci sono errori o avvertimenti.

Perché è così?

Si tratta di un comportamento non definito, in quanto non è ansible provare in modo affidabile che la memoria dietro il puntatore sia stata allocata correttamente (ad es. new per delete o new[] per delete[] ). È compito tuo assicurare che cose del genere non accadano. È semplice quando usi gli strumenti giusti, ovvero puntatori intelligenti. Ogni volta che dici delete , stai sbagliando.

allora dovrebbe esserci qualche errore

C’è. Non è necessariamente evidente.

Lo standard C ++ (e lo standard C, su cui viene modellato lo standard C ++) chiama questo tipo di comportamento non definito di errore. Per indefinito significano che può accadere qualsiasi cosa. Il programma potrebbe continuare normalmente, potrebbe bloccarsi immediatamente, potrebbe produrre un messaggio di errore ben definito ed uscire con garbo, potrebbe iniziare a mostrare errori casuali in qualche momento dopo l’evento di comportamento non definito effettivo o richiamare demoni nasali .

È tua responsabilità controllare ed eliminare questi errori. Nulla è garantito per avvisarti quando accadono.

Usa free() non delete .

se hai malloc devi chiamare free per liberare memoria.

se sei new devi chiamare delete nella memoria libera.

Ecco un link che lo spiega.