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)
AnsiString
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 ClientesPD
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.