non sono troppo familiarità con le heap di debug e STL controlli, ma quando ho problemi di memoria in GCC su linux utilizzare una variabile d'ambiente chiamata MALLOC_CHECK_ (da malloc (3)):
recenti le versioni di Linux libc (successive alla 5.4.23) e GNU libc (2.x) includono un'implementazione di malloc che può essere regolata tramite variabili d'ambiente. Quando viene impostato MALLOC_CHECK_, viene utilizzata un'implementazione speciale (meno efficiente) che è progettata per essere tollerante contro errori semplici, ad esempio chiamate doppie di free() con lo stesso argomento o superamenti di un singolo byte (off-by -uno bug). Tuttavia, non tutti gli errori possono essere protetti da tali errori e possono verificarsi perdite di memoria. Se MALLOC_CHECK_ è impostato su 0, qualsiasi danneggiamento dell'heap rilevato viene silenziosamente ignorato; se è impostato su 1, una diagnostica viene stampata su stderr; se impostato su 2, abort() viene chiamato immediatamente . Questo può essere utile perché in caso contrario un incidente potrebbe verificarsi molto più tardi, e la vera causa del problema è quindi molto difficile da rintracciare.
C'è anche il Recinto Elettrico che può aiutare a catturare i sovraccarichi del buffer interrompendo non appena il sovraccarico/svuotamento avviene. Vedere libefence(3) per ulteriori informazioni.
fonte
2009-07-24 13:19:00
Questo è esattamente ciò che fa il Debug Heap Peter, grazie! Sai se questi controlli sono fatti anche per nuovi/cancella? – rpg
Lo fa nella mia implementazione (l'eliminazione dell'operatore, almeno, sembra avere una chiamata di base a free(), quindi cattura il double-free). Electric Fence cattura definitivamente i sovraccarichi del buffer con memoria allocata dall'operatore new. –
Si noti che glibc 2.10 e 2.11 sono buggy: MALLOC_CHECK_ può causare blocchi e interruzioni di programmi multi-thread. – ephemient