bds 2006 C versteckte Speichermanagerkonflikte (Klasse Neu / Löschen [] vs. AnsiString)

ich benutzeBDS 2006 Turbo C ++ schon lange und einige meiner größeren Projekte (CAD / CAM, 3D Gfx-Motoren und astronomische Berechnungen lösen gelegentlich eine Ausnahme aus (z. B. einmal in 3-12 Monaten bei starker Beanspruchung rund um die Uhr). Nach ausführlichem Debugging fand ich Folgendes:

//code1:
struct _s { int i; }    // any struct
_s *s=new _s[1024];     // dynamic allocation
delete[] s;             // free up memory

Dieser Code befindet sich normalerweise in template where_s kann also auch klasse seindelete[] Dieser Code sollte ordnungsgemäß funktionieren, aber diedelete[] funktioniert nicht richtig für Strukturen (Klassen sieht OK aus). Es werden keine Ausnahmen ausgelöst, der Speicher wird freigegeben, aber die Zuweisungstabellen des Speichermanagers werden irgendwie beschädigt, und danach kann jede neue Zuweisung falsch sein (neu kann überlappende Zuweisungen mit bereits zugewiesenem Speicherplatz oder sogar nicht zugewiesenem Speicherplatz erstellen, daher gelegentliche Ausnahmen).

Ich habe das gefunden, wenn ich leeren Destruktor hinzufüge_s dann scheint plötzlich alles in ordnung

struct _s { int i; ~_s(){}; }

Nun kommt der seltsame Teil. Nachdem ich dies auf meine Projekte aktualisiert habe, habe ich das gefundenAnsiString Klasse hat auch schlechte Neuzuordnungen. Zum Beispiel:

//code2:
int i;
_s *dat=new _s[1024];
AnsiString txt="";
// setting of dat
for (i=0;i<1024;i++) txt+="bla bla bla\r\n";
// usage of dat
delete[] dat;

In diesem Codedat enthält einige nützliche Daten, später einigetxt Zeichenfolge, die durch Hinzufügen von Zeilen erstellt wird, damit dietxt muss einige Male neu zugewiesen werden und manchmal diedat Daten werden von überschriebentxt (Auch wenn sie nicht überlappen, ich denke, die tempAnsiString benötigt, um neu zuzuteilentxt überlappt mitdat)

Meine Fragen sind also:

Mache ich etwas falsch in Code1, Code2?

Gibt es eine Möglichkeit, dies zu vermeiden?AnsiString (Neu-) Zuordnungsfehler? (aber benutze es immer noch)

Nach ausführlichem Debuggen (nach dem Posten von Frage 2) habe ich das gefundenAnsiString verursachen Sie keine Probleme. Sie treten nur auf, wenn sie verwendet werden. Das eigentliche Problem ist wahrscheinlich der Wechsel zwischenOpenGL Kunden. Ich habe Open / Save-Dialoge mit Vorschau für Vektorgrafiken. Wenn ich deaktiviereOpenGL Verwendung für dieseVCL Unterfenster alsAnsiString Speicherverwaltungsfehler verschwinden vollständig. Ich bin nicht an Land, was ist das Problem (Inkompatibilität zwischenMFC / VCL Windows oder wahrscheinlicher habe ich einen Fehler beim Wechseln der Kontexte gemacht (wird weiter untersucht). Besorgnis, SorgeOpenGL Fenster sind:MainVCL Formular +OpenGL InnerhalbCanvas KundenbereichKind von mainMFC Öffnen / Speichern-Dialog + angedockte VorschauVCL Formular +OpenGL InnerhalbCanvas Kundenbereich

P.S.

Diese Fehler sind abhängig von der Anzahl dernew/delete/delete[] Verwendungen nicht auf die zugewiesenen GrößenSowohl Code1- als auch Code2-Fehler wiederholen sich (haben beispielsweise einen Parser zum Laden einer komplexen INI-Datei, und der Fehler tritt in derselben Zeile auf, wenn die INI nicht geändert wird).Ich entdecke diese Fehler nur bei großen Projekten (einfacher Quellcode> 1MB) mit kombinierter Nutzung vonAnsiString und Vorlagen mit internen dynamischen Zuordnungen, aber es ist möglich, dass sie auch in einfacheren Projekten sind, aber so selten vorkommt, dass ich es vermisse.Spezifikationen infizierter Projekte:Win32 noinstall Standalone (mitWin7sp1 x64 aber weiterXPsp3 x32 verhält sich genauso)dosiert nicht bei VerwendungGDI oderOpenGl / GLSLmisst nicht, wenn Gerätetreiber verwendet wirdDLLs oder nichtNeinOCXoder nicht standardVCL KomponenteNeinDirectX1 Byte ausgerichtete Kompilierung / Verknüpfungverwende nichtRTL, Pakete oder Frameworks (Standalone)

Sorry für schlechtes Englisch / Grammatik ... jede Hilfe / Schlussfolgerung / Vorschlag geschätzt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage