Prima di tutto, usare delete
per qualsiasi cosa allocata con new[]
è un comportamento non definito secondo lo standard C++.In che modo l'abbinamento nuovo [] con eliminazione può portare solo alla perdita di memoria?
In Visual C++ 7 tale abbinamento può portare a una delle due conseguenze.
Se il tipo di nuova [] 'ed ha costruttore banale e distruttore VC++ usa semplicemente new
invece di new[]
e l'utilizzo di delete
per quel blocco funziona bene - new
solo chiama 'allocare memoria', delete
chiama semplicemente 'memoria libera'.
Se il tipo new [] 'ed ha un costruttore o distruttore non banale il trucco sopra non può essere fatto - VC++ 7 deve invocare esattamente il giusto numero di distruttori. Quindi prepara l'array con un size_t
memorizzando il numero di elementi. Ora l'indirizzo restituito da new[]
punti sul primo elemento, non all'inizio del blocco. Quindi, se viene utilizzato delete
, chiama solo il distruttore per il primo elemento e le chiamate "memoria libera" con l'indirizzo diverso da quello restituito da "allocare memoria" e questo porta a qualche indicazione di errore all'interno di HeapFree() che a mio avviso si riferisce a corruzione dell'heap.
Eppure ogni qui e là si possono leggere dichiarazioni false che utilizzando delete
dopo new[]
porta a una perdita di memoria. Sospetto che qualsiasi dimensione della corruzione dell'heap sia molto più importante di un fatto che il distruttore è chiamato solo per il primo elemento e che probabilmente i distruttori non chiamati non hanno liberato oggetti secondari allocati all'heap.
In che modo l'utilizzo di delete
dopo il new[]
può portare solo a una perdita di memoria in alcune implementazioni C++?
Per tutti i rispondenti: la domanda è come può portare a ** solo ** una perdita di memoria, cioè come può ** non ** causare il danneggiamento dell'heap. – Thomas
Abbastanza facilmente. Tutto dipende da come viene scritta la gestione della memoria. Dal momento che questo non è definito dallo standard, tutte le risposte sono solo speculazioni (ma sono sicuro che potrei scrivere una versione che non manderebbe in crash l'heap ma abbia perso memoria). Il sottosistema di gestione della memoria è il più veloce ed efficiente possibile. Lo standard ha fornito loro una serie di condizioni pre e post in base alle quali il sottosistema può essere ottimizzato. Rompi queste condizioni e hai un comportamento indefinito (probabilmente il danneggiamento dell'heap). Nel debug, la stabilità e non la velocità sono l'obiettivo del sottosistema di memoria. Quindi la perdita è più probabile. –
http://stackoverflow.com/questions/1553382/pod-freeing-memory-is-delete-equal-to-delete/1553407#1553407 – sbi