2010-07-06 14 views
12

Questa domanda è stato chiesto di me in un'intervista:nuova, eliminare, malloc & free

In C++,

  1. cosa succederebbe se allocare la memoria utilizzando malloc e utilizzare delete per liberare quella memoria allocata ?
  2. E se allocassimo la memoria usando new e lo liberassimo usando free?

Quali sono i problemi che dovremmo affrontare se le suddette operazioni vengono utilizzate nel codice?

La mia risposta è stata che non c'è differenza. Avevo ragione nel dirlo?

+0

correlati: http://stackoverflow.com/questions/1350819/c-free-store-vs-heap –

+1

Spero che abbia risposto direttamente alle altre domande – ereOn

+7

"non c'è differenza". -> Questo è tecnicamente corretto, entrambi i punti portano a un comportamento indefinito, quindi non c'è alcuna differenza :) – fredoverflow

risposta

14

Se lo fai, ti imbatterai in un comportamento indefinito. Non provarlo mai. Anche se new potrebbe essere implementato attraverso malloc() e delete potrebbe essere implementato attraverso free() non c'è alcuna garanzia che essi sono realmente implementate in questo modo e anche l'utente può sovraccaricare new e delete a sua discrezione. Rischia di incappare nella corruzione dell'heap.

Oltre a ciò, non dimenticare che quando si chiama malloc() si ottiene una memoria non elaborata - nessun costruttore viene richiamato - e quando si chiama free() non viene richiamato alcun distruttore. Questo può anche portare a comportamenti indefiniti e funzionamento improprio del programma.

La linea di fondo è ... non farlo mai.

1

1) Comportamento non definito ma probabilmente "funzionante". I distruttori verranno richiamati sulla memoria liberata che non vuole essere decostruita.
2) Comportamento non definito, ma probabilmente "funzionerà". I distruttori NON verranno chiamati.

vale a dire SE funziona, e non c'è alcuna garanzia di ciò, allora funzionerà solo, probabilmente, esattamente come richiesto per i tipi di dati di base incorporati.