Конфликты скрытого менеджера памяти bds 2006 C (класс new / delete [] и AnsiString)

Я используюBDS 2006 Turbo C ++ давно и некоторые из моих крупных проектов (CAD / CAM, 3D GFX-движки и астрономические вычисления) иногда выдают исключение (например, один раз в 3–12 месяцев работы в тяжелых условиях 24/7). После обширной отладки я нашел это:

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

этот код обычно находится внутри шаблона, где_s может быть также классом, поэтомуdelete[] этот код должен работать правильно, ноdelete[] не работает должным образом для структур (классы выглядят нормально). Не генерируется никаких исключений, память освобождается, но это каким-то образом повреждает таблицы распределения диспетчера памяти, и после этого любое новое выделение может быть неправильным (new может создавать перекрывающиеся выделения с уже выделенным пространством или даже нераспределенным пространством, следовательно, случайные исключения)

Я обнаружил, что если я добавлю пустой деструктор в_s чем вдруг кажется все ок

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

Что ж, теперь начинается странная часть. После того, как я обновлю это для своих проектов, я обнаружил, чтоAnsiString класс имеет также плохие перераспределения. Например:

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

В этом кодеdat содержит некоторые полезные данные, а затем некоторыеtxt строка, созданная путем добавления строк, чтобыtxt должны быть перераспределены несколько раз, а иногдаdat данные перезаписываютсяtxt (даже если они не перекрываются, я думаю, что температураAnsiString необходимо перераспределитьtxt перекрывается сdat)

Итак, мои вопросы:

Я делаю что-то не так в code1, code2?

Есть ли способ избежатьAnsiString (пере) ошибки распределения? (но все еще использую это)

После обширной отладки (после публикации вопроса 2) я обнаружил, чтоAnsiString не вызывает проблем. Они появляются только при их использовании. Настоящая проблема, вероятно, заключается в переключении междуOpenGL клиентов. У меня есть диалоги Open / Save с предварительным просмотром для векторной графики. Если я отключуOpenGL использование для этихVCL под окнами, чемAnsiString Ошибки управления памятью исчезают полностью. Я не берег, в чем проблема (несовместимость междуMFC / VCL Windows или, скорее всего, я сделал какую-то ошибку при переключении контекстов, будем дополнительно исследовать). БеспокойствоOpenGL окна являются:главныйVCL Форма +OpenGL внутриCanvas клиентская зонаглавный ребенокMFC Диалог открытия / сохранения + предварительный просмотрVCL Форма +OpenGL внутриCanvas клиентская зона

Постскриптум

эти ошибки зависят от количестваnew/delete/delete[] использования не по выделенным размерами code1, и code2 ошибки повторяются (например, есть парсер для загрузки сложного INI-файла, и ошибка возникает в одной строке, если INI-файл не изменяется)Я обнаруживаю эти ошибки только в больших проектах (простой исходный код> 1 МБ) с комбинированным использованиемAnsiString и шаблоны с внутренним динамическим распределением, но возможно, что они также находятся в более простых проектах, но встречаются настолько редко, что я пропускаю это.Спецификации зараженных проектов:win32 noinstall standalone (используяWin7sp1 x64 но наXPsp3 x32 ведет себя так же)не измеряет при использованииGDI или жеOpenGl / GLSLне горит, если используется драйвер устройстваDLLс или нетнетOCXили нестандартныйVCL составная частьнетDirectXКомпиляция / ссылка на 1 байтне используйРТЛ, пакеты или рамки (автономные)

Извините за плохой английский / грамматику ... любая помощь / заключение / предложение приветствуется.

Ответы на вопрос(1)

Ваш ответ на вопрос