bds 2006 Conflitos do gerenciador de memória oculta (classe new / delete [] vs. AnsiString)

estou usandoBDS 2006 Turbo C ++ por um longo tempo agora e alguns dos meus projetos maiores (CAD / CAM, 3D motores gfx e cálculos astronômicos) ocasionalmente lançam uma exceção (por exemplo, uma vez em 3-12 meses de uso intenso em 24/7). Depois de extensa depuração, encontrei isto:

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

este código é geralmente dentro do modelo onde_s pode ser também classe, portantodelete[] este código deve funcionar corretamente, mas odelete[] não funciona corretamente para estruturas (classes parece OK). Nenhuma exceção é lançada, a memória é liberada, mas de alguma forma danifica as tabelas de alocação do gerenciador de memória e após isso qualquer nova alocação pode estar errada (novo pode criar alocações sobrepostas com espaço já alocado ou mesmo espaço não alocado, portanto as exceções ocasionais)

Eu descobri que se eu adicionar o destruidor vazio para_s que de repente parece tudo bem

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

Bem, agora vem a parte estranha. Depois de atualizar isso para meus projetos, descobri queAnsiString classe também tem realocações ruins. Por exemplo:

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

Neste códigodat contém alguns dados úteis, mais tarde étxt string criado pela adição de linhas para que otxt deve ser realocado poucas vezes e às vezes odat os dados são sobrescritos portxt (mesmo se eles não estão sobrepostos, eu acho que o tempAnsiString necessário realocartxt é sobreposto comdat)

Então minhas perguntas são:

Estou fazendo algo errado no code1, code2?

Existe alguma maneira de evitarAnsiString (re) erros de alocação? (mas ainda usando)

Após extensa depuração (depois de postar a pergunta 2), descobri queAnsiString não cause problemas. Eles só ocorrem quando são usados. O problema real é provavelmente na troca entreOpenGL clientes. Tenho diálogos Abrir / Salvar com visualização para gráficos vetoriais. Se eu desabilitarOpenGL uso para estesVCL sub-janelas do queAnsiString os erros de gerenciamento de memória desaparecem completamente. Eu não estou em terra qual é o problema (incompatibilidade entreMFC / VCL windows ou mais provavelmente eu cometi algum erro em mudar de contexto, vai investigar mais). PreocupaçãoOpenGL as janelas são:a PrincipalVCL Formulário +OpenGL dentroCanvas Área do clientefilho do principalMFC Abrir / salvar caixa de diálogo + visualização encaixadaVCL Formulário +OpenGL dentroCanvas Área do cliente

P.S.

esses erros dependem do número denew/delete/delete[] usos não nos tamanhos alocadosos erros code1 e code2 são repetitivos (por exemplo, ter um analisador para carregar um arquivo ini complexo e o erro ocorre na mesma linha se o ini não for alterado)Eu detecto esses erros somente em grandes projetos (código fonte simples> 1 MB) com uso combinado deAnsiString e modelos com alocações dinâmicas internas, mas é possível que eles também estejam em projetos mais simples, mas ocorrem tão raramente que sinto falta dele.Especificações de projetos infectados:win32 noinstall standalone (usandoWin7sp1 x64 mas emXPsp3 x32 se comporta da mesma forma)não mede se usarGDI ouOpenGl / GLSLnão mede se usar driver de dispositivoDLLs ou nãonãoOCXou não padrãoVCL componentenãoDirectX1 compilação / link alinhado por bytenão useRTL, pacotes ou frameworks (autônomo)

Desculpe por mau Inglês / gramática ... qualquer ajuda / conclusão / sugestão apreciado.

questionAnswers(1)

yourAnswerToTheQuestion