![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не работает Tstringlist :(
ishicucu © (2007-02-11 22:59:00)Обявляю переменную типа Tstringlist, метод Add вызывает ошибку 'чета с памятью', пробовал ставить в начале конструкто, не помогает.
ishicucu (2007-02-12 19:49:00) [1]Все работает, спасибо.
Loginov Dmitry (2007-02-12 18:12:00) [2]procedure TStringList.SetCapacity(NewCapacity: Integer);
begin
ReallocMem(FList, NewCapacity * SizeOf(TStringItem));
FCapacity := NewCapacity;
end;
destructor TStringList.Destroy;
begin
FOnChange := nil;
FOnChanging := nil;
inherited Destroy;
if FCount <> 0 then Finalize(FList^[0], FCount);
FCount := 0;
SetCapacity(0);
end;
Игорь Шевченко (2007-02-12 17:42:00) [3]Loginov Dmitry © (12.02.07 17:34) [14]
А если не трудно, кусочек из реализации в студию
Loginov Dmitry (2007-02-12 17:34:00) [4]> Ну-ка, ну-ка, какой указатель "обнуляется"?
Посмотри в реализацию.
Игорь Шевченко (2007-02-12 17:20:00) [5]Выпрямители подорожали видно.
RASkov (2007-02-12 17:19:00) [6]> sl.create;
Таким образом ты выполнил "процедуру" Create у экземпляра класса, но так как память для нее(переменной) не распределена, то и впоследствии при обращении к методам или полям выскакивает ошибка доступа памяти. Память выделяется когда вызывают конструктор у класса а не у экземпляра класса.
Плохиш (2007-02-12 17:15:00) [7]
> Loginov Dmitry © (12.02.07 07:52) [8]
> Это благодаря тому, что в TStringList в деструкторе обнуляется
> указатель.
Ну-ка, ну-ка, какой указатель "обнуляется"?
Amoeba (2007-02-12 17:06:00) [8]
> контструктор вызываю следующим образом:
>
> sl.create;
>
> может изза этого не работает, ща попробую как вы сказали
>
Именно из-за этого!
ishicucu (2007-02-12 15:59:00) [9]не такой я тупак, чтобы после метода free вызвать add
контструктор вызываю следующим образом:
sl.create;
может изза этого не работает, ща попробую как вы сказали
Loginov Dmitry (2007-02-12 07:52:00) [10]> SL.Free;
> ShowMessage(SL[0]); // вызывает ошибку 'чета с памятью'
> SL.Add('Во косяк'); // вызывает ошибку 'чета с памятью'
После такого ошибка будет выдана. Причем будет появляться стабильно. Это благодаря тому, что в TStringList в деструкторе обнуляется указатель. А вот если бы он не обнулялся, то рано или поздно ошибка все-равно где-нибудь проявилась, а вот где и когда - хз.
RASkov (2007-02-12 02:02:00) [11]> [5] fd979 © (11.02.07 23:39)
> [6] RASkov (12.02.07 02:00)
> > [5] fd979 © (11.02.07 23:39)
> Неудачно....
Не удачно - это мой пример неудачный :) Т.е. недостаточно прокомментирован... Сорри.
RASkov (2007-02-12 02:00:00) [12]> [5] fd979 © (11.02.07 23:39)
Неудачно....
Это я намеренно вставил, ибо хотел показать автору, в каких случаях у него могла возникнуть такая ошибка....
fd979 (2007-02-11 23:39:00) [13]
> SL.Free;
И ты хочешь, чтобы после этого не вылетала ошибка?
RASkov (2007-02-11 23:22:00) [14]> [3] RASkov (11.02.07 23:20)
Не на ту кнопку нажал, извеняюсь.
> > пробовал ставить в начале конструкто, не помогает.
Это как?
RASkov (2007-02-11 23:20:00) [15]> Не работает Tstringlist :(
Как не работает? А так попробуй:
var SL: TStringList;
....
SL:=TStringList.Create;
SL.Add('Добавилась');
ShowMessage(SL[0]);
SL.Free;
ShowMessage(SL[0]); // вызывает ошибку 'чета с памятью'
SL.Add('Во косяк'); // вызывает ошибку 'чета с памятью'
Работать должны мозги :)
> пробовал ставить в начале конструкто, не помогает.
Efir (2007-02-11 23:13:00) [16]А не забыл:
твоя переменная := TStringList.Create
Virgo_Style (2007-02-11 23:01:00) [17]как пробовал?