Все симптомы говорили об этом.
Я даже выделил тест:
Я даже выделил тест:
procedure TReallocMemTest.DoIt; var l_Index : Integer; l_P : PAnsiChar; l_I : Integer; l_Size : Integer; l_OldSize : Integer; begin for l_Index := 0 to 5000 do begin l_Size := 10; GetMem(l_P, l_Size); try while (l_Size <= 6144 * 2) do begin FillChar(l_P^, l_Size, Random($ff)); l_OldSize := l_Size; l_I := PInteger(l_P + l_OldSize - SizeOf(Integer))^; Inc(l_Size, Random(20)); ReallocMem(l_P, l_Size); Check(PInteger(l_P + l_OldSize - SizeOf(Integer))^ = l_I); end;//l_Size <= 6144 finally FreeMem(l_P); end;//try..finally end;//for l_Index end;//TReallocMemTest.DoIt procedure TReallocMemTest.DoIt1; const cMagicSize0 = 10; cMagicSize = 3120; cNewMagicSize = 6144; var l_P : PAnsiChar; l_I : Integer; begin GetMem(l_P, cMagicSize0); try FillChar(l_P^, cMagicSize0, 10); l_I := PInteger(l_P + cMagicSize0 - SizeOf(Integer))^; ReallocMem(l_P, cNewMagicSize); Check(PInteger(l_P + cMagicSize0 - SizeOf(Integer))^ = l_I); FillChar(l_P^, cMagicSize, 10); l_I := PInteger(l_P + cMagicSize - SizeOf(Integer))^; ReallocMem(l_P, cNewMagicSize); Check(PInteger(l_P + cMagicSize - SizeOf(Integer))^ = l_I); finally FreeMem(l_P); end;//try..finall end;//TReallocMemTest.DoIt
И даже поделился с коллегами о своём "открытии". И даже написал в Embarcadero.
Но! Без предварительного вызова МОЕГО КОДА - этот тест - не падает.
Мячик на моей стороне.
Каким же я выглядел идиотом.
Но правда совсем не ошибается лишь тот, кто ничего не делает. Зато я добавил ещё один тест в базу тестов.
Как я уже писал - написанный и ОТЛАЖЕННЫЙ тест - надо не выкидывать, а включать в базу тестов. ЛЮБОЙ. За него "кровью и нервами уплочено".
Как говорится в сказках про Иванушку-дурачка - "не убивай меня - я тебе пригожусь".
Надеюсь, что итоги сегодняшнего дня помогут мне стать капельку мудрее.
P.S. а проблемы на самом деле были вот в этом "хоккее" - http://18delphi.blogspot.com/2013/04/getmem.html
P.S. а проблемы на самом деле были вот в этом "хоккее" - http://18delphi.blogspot.com/2013/04/getmem.html
Комментариев нет:
Отправить комментарий