2009-04-24 3 views
7

Ho avuto qualche problema con vs2008 SP1 eseguito in modalità di debug quando provo a disabilitare gli iteratori verificati. Il seguente programma riproduce il problema (un incidente nel distruttore string):Problema durante la disattivazione degli iteratori verificati in SP200 vs2008 (_HAS_ITERATOR_DEBUGGING = 0)

#define _HAS_ITERATOR_DEBUGGING 0 

#include <sstream> 

int do_stuff(std::string const& text) 
{ 
    std::string::const_iterator i(text.end()); 
    return 0; 
} 

int main() 
{ 
    std::ostringstream os; 
    os << "some_text"; 
    return do_stuff(os.str()); 
} 

che avevo trovato un similar post su gamdev.net che ha discusso avere questo problema in VS2005. Il programma di esempio in questo post mi compila per SP1 2008 così com'è - ma quando lo ho modificato per usare ostringstream, sono riuscito a ottenere il problema.

Da rovistando nel debugger, sembra che la biblioteca si apre iteratori dallo stack, poi tenta di utilizzarli in _Orphan_All, che è una sorta di iteratore controllare il codice di pulitura ...

Can chiunque altro riproduci questo problema o dimmi cosa sta succedendo?

Grazie!

risposta

6

Ho appena provato questo in VS2008 su Windows XP e ha ricevuto un avviso riguardante un overflow del buffer, sia su un pre200 che su un VS2008 post-SP1.

È interessante notare che il problema sembra essere centrato intorno passando la stringa in do_stuff mediante riferimento o per valore - se uso il codice originale, si lamenta il buffer overflow, ma se mi passate la stringa in da valore, funziona bene Questo è con il runtime DLL di debug multithread. L'errore scompare quando ti piace contro il runtime MT Debug statico.

In entrambi i casi, le intestazioni precompilate sono state disattivate ei file che normalmente generano le intestazioni precompilate sono stati rimossi dal progetto.

Dopo aver letto this article on MSDN Mi chiedo se il problema deriva dal fatto che molti C++ classi della libreria standard sono in realtà risiedono nella libreria di runtime se si costruisce con i tempi di esecuzione di debug DLL (solo cercare di collegare un binario VS2008 generati contro una libreria precedente e fare attenzione agli aspetti esterni non risolti per confermare ciò).

+0

Tale articolo dà la risposta esatta: " ... ci sono due bug conosciuti che rimangono in VC9, uno dei quali non può essere fissato in VC9 senza rompere la compatibilità binaria Si può essere in esecuzione in questi bug, tuttavia, come hanno. sono all'interno della stringa (e sono, a nostra conoscenza, specifico per utilizzare stringstreams) ..." avevo bisogno stringstream per creare il problema. Grazie per il vostro aiuto a tutti! –

1

Il codice funziona correttamente in modalità debug/release sul mio VS2005. Ho disattivato le intestazioni precompilate e uso la versione DLL multi-threaded della libreria runtime.

Controllato con VS2008 SP1 su una macchina Vista (senza intestazioni precompilate, DLL multi-thread). Funziona bene.

Verifica l'installazione.

+0

Grazie anche per il controllo del 2008. Sono in esecuzione su WinXP, non su Vista, anche se sarò un po 'sorpreso se questo non faccia alcuna differenza. Controllerà la mia installazione. –

4

Ecco come si presenta un bug noto in VS2005 che è stato fissato in VS2005 SP1:

appare come questa è stata presentata dal ragazzo che ha pubblicato a questo proposito sul gamedev.net.

Non sono sicuro di come o perché si sarebbe insinuato di nuovo in VS2008 (avete intestazioni da VS2005 che potrebbe essere sempre inthe modo o qualcosa del genere?)

+0

Io ho VS2005 - Ho provato a nascondere l'intera cartella per esso e la ricostruzione, ma ho ancora ottenere lo stesso risultato. Il ragazzo gamedev non ha dovuto usare ostringstream per riprodurre il problema però. Mi chiedo se sia una scappatoia che non hanno chiuso. –

+0

Di solito non sono un fan di 'bug' del compilatore, ma che sembra come un preciso possiblility data la somiglianza (ma con la torsione ostringstream). –

Problemi correlati