bds 2006 C conflictos de gestión de memoria oculta (clase nueva / eliminar [] frente a AnsiString)

estoy usandoBDS 2006 Turbo C ++ desde hace mucho tiempo y algunos de mis proyectos más grandes (CAD / CAM, 3D Los motores gfx y los cálculos astronómicos) ocasionalmente producen una excepción (por ejemplo, una vez en 3 a 12 meses de uso de servicio pesado 24/7). Después de una extensa depuración encontré esto:

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

este código es generalmente dentro de la plantilla donde_s puede ser también clase por lo tantodelete[] este código debería funcionar correctamente, pero ladelete[] no funciona correctamente para las estructuras (las clases se ven bien). No se lanzan excepciones, la memoria se libera, pero de alguna manera daña las tablas de asignación del administrador de memoria y después de esto, cualquier nueva asignación puede ser incorrecta (la nueva puede crear asignaciones superpuestas con espacio ya asignado o incluso espacio no asignado, por lo tanto, las excepciones ocasionales)

He encontrado que si agrego destructor vacío a_s que de repente parece todo bien

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

Bueno, ahora viene la parte rara. Después de actualizar esto a mis proyectos he encontrado queAnsiString La clase también tiene malas reasignaciones. Por ejemplo:

//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;

En este codigodat contiene algunos datos útiles, luego más adelantetxt cadena creada mediante la adición de líneas por lo que latxt debe ser reasignado pocas veces y, a veces, ladat los datos son sobrescritos portxt (Incluso si no se superponen, creo que la temperaturaAnsiString necesario para reasignartxt se superpone condat)

Así que mis preguntas son:

¿Estoy haciendo algo mal en code1, code2?

¿Hay alguna manera de evitarAnsiString (re) errores de asignación? (pero aun así usándolo)

Después de una extensa depuración (después de publicar la pregunta 2) he encontrado queAnsiString No cause problemas. Solo se producen al usarlos. El verdadero problema está probablemente en cambiar entreOpenGL clientela. Tengo cuadros de diálogo Abrir / Guardar con vista previa para gráficos vectoriales. Si desactivoOpenGL uso para estosVCL subventanas queAnsiString Los errores de gestión de memoria desaparecen por completo. No estoy en la orilla cuál es el problema (incompatibilidad entreMFC / VCL ventanas o más probablemente cometí algún error al cambiar de contexto, investigaré más a fondo). PreocupaciónOpenGL las ventanas son:principalVCL Forma +OpenGL dentroCanvas Área de Clienteshijo de mainMfc Abrir / Guardar diálogo + vista previa acopladaVCL Forma +OpenGL dentroCanvas Área de Clientes

PD

estos errores dependen de la cantidad denew/delete/delete[] usos no en los tamaños asignadoslos errores de code1 y code2 son repetitivos (por ejemplo, tienen un analizador para cargar el archivo ini complejo y el error se produce en la misma línea si no se cambia el ini)Detecto estos errores solo en grandes proyectos (código fuente simple> 1MB) con uso combinado deAnsiString y plantillas con asignaciones dinámicas internas, pero es posible que también se encuentren en proyectos más simples, pero ocurre tan raramente que lo echo de menos.Especificaciones de proyectos infectados:win32 noinstall standalone (usandoWin7sp1 x64 pero enXPsp3 x32 se comporta igualno mide si se usaGDI oOpenGl / GLSLno mide si se usa el controlador del dispositivoDLLs o nonoOCX, o no estándarVCL componentenoDirectX1 byte alineado compilación / enlaceno utiliceRTL, paquetes o marcos (independientes)

Lo siento por el mal inglés / gramática ... cualquier ayuda / conclusión / sugerencia apreciada.

Respuestas a la pregunta(1)

Su respuesta a la pregunta