Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.13;
Скачать: CL | DM;

Вниз

Проблема с массивом строк.   Найти похожие ветки 

 
account1024 ©   (2007-12-11 17:07) [0]

Проблема начинается когда я освобождаю память (выдает ошибку - InvalidPointer).

 TStrArrayType = ShortString;
 TStrArray       = array [0..255] of TStrArrayType;
 PStrArray       = ^TStrArray;

 function MakeStrArray( sStr: string; sChar: string ): integer;
 var
   i1, i2: integer;
   s:      string;
 begin
   Result:= 0;
   if bStrArrayLock then exit;

   i2:= NumToken( sStr, sChar );
   iStrArraySize:= i2;
   GetMem( aStrArray, iStrArraySize * sizeof(TStrArrayType));
   Result:= i2;

   for i1:= 1 to i2 do
   begin
     s:= GetToken( sStr, sChar, i2 ); // GetToken - возвращает слово из строки (sStr) по номеру (i2) используя разделитель (sChar)

     aStrArray^[i2]:= s;
   end;

   bStrArrayLock:= true;
 end;

 function GetStrArray( iIndx: integer ): TStrArrayType;
 begin
   if iStrArraySize < 1 then Result:=  ""
   else Result:= aStrArray^[iIndx];
 end;

 procedure FlushStrArray;
 begin
   FreeMem( aStrArray, iStrArraySize * sizeof(TStrArrayType) );
   bStrArrayLock:= false;
 end;

Что я делаю не так?


 
Kolan ©   (2007-12-11 17:08) [1]

> Что я делаю не так?

Вы используете массив строк.

Используйте, TStrings (TStringList). Не забудьте начать с чтения справки.


 
account1024 ©   (2007-12-11 17:11) [2]

[b]to Kolian[/b]
А почему так оно не работает?


 
account1024 ©   (2007-12-11 17:13) [3]

Забыл добавить в первый пост:

 aStrArray:      PStrArray;
 iStrArraySize:  integer;
 bStrArrayLock:  boolean = false;


 
Palladin ©   (2007-12-11 17:18) [4]

не видно где объявлен aStrArray и тот ли aStrArray освобождается...  самое интересное массив у тебя объявлен как [0.. а заполняешь ты егос 1 элемента, идет заброд за границы взятой памяти


 
Сергей М. ©   (2007-12-11 17:21) [5]


> FreeMem( aStrArray, iStrArraySize * sizeof(TStrArrayType)
> );


А если просто

FreeMem(aStrArray)

то та же ошибка ?


 
Григорьев Антон ©   (2007-12-11 17:21) [6]

Вот интересно... Массив вы объявили с диапазоном [0..255], а индекс у вас везде начинается с 1. Если вы для такого массива выделяете память на iStrArraySize, то индексы элементов будут лежать в диапазоне от 0 до iStrArraySize-1, а не от 1 до iStrArraySize, как в вашем коде. Когда вы обращаетесь к элементу с индексом iStrArraySize, вы на самом деле залезаете в память, уже не принадлежащую выделенному блоку, и тем самым портите в т.ч. и служебную информацию менеджера памяти о следующем блоке. Скорее всего, это и вызывает ошибку - при освобождении памяти менеджер памяти смотрит, какой блок идёт после вашего и пытается объединить два свободных блока в один, а так как информация уже испорчена, это у него не получается.

А ещё, при вызове FreeMem не надо указывать размер освобождаемой памяти - этот параметр оставлен только для совместимости c TP и в Delphi просто игнорируется - менеджер памяти сам знает, сколько освобождать.

Ну а самое правильное в такой ситуации - использовать динамический массив.


 
account1024 ©   (2007-12-11 17:26) [7]

Я дурак! Про [0..255] это я не углядел. Спасибо, все работает.



Страницы: 1 вся ветка

Текущий архив: 2008.01.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
15-1197218888
Grain
2007-12-09 19:48
2008.01.13
Выборы грядут!


2-1197376680
Kolan
2007-12-11 15:38
2008.01.13
Как правильно сделать вывод из консоли?


4-1182150503
Dimaxx
2007-06-18 11:08
2008.01.13
Внутренняя конфигурация HDD


15-1196877168
Ega23
2007-12-05 20:52
2008.01.13
Отбываю в Дагестан


15-1197217747
Grain
2007-12-09 19:29
2008.01.13
Выборы грядут