Конфликты скрытого менеджера памяти 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