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

Вниз

Подозрительная конструкция какая-то. (record + TStrings)   Найти похожие ветки 

 
BlackTiger ©   (2004-03-04 13:00) [0]

Показал мне тут один товарищ свою конструкцию. Странное сувство у меня возникло, что что-то опасное тут есть.


type
 TSomeType = record
   Value1: integer;
   Value2: string;
   OtherValues: TStrings;
 end;


Далее идет что-то вроде

function GetSomeType(const Param1: string): TSomeType
var
 v: TSomeType;
 i: integer;
begin
//...
 v.OtherValues := TStrings.Create;
 //Заполнение v.OtherValues
//...
 Result := v;
 for i := 0 to v.OtherValues.Count - 1 do
 begin
   v.OtherValues[i].Destroy;
 end;
end;


Дальше в тексте идет:

var
 SomeValue: TSomeValue;
begin
 //...
 SomeValue := GetSomeValue(SomeParameter); // без Create"ов!
 //...
 //...
 //...
 for i := 0 to SomeValue.OtherValues.Count - 1 do
 begin
   SomeValue.OtherValues[i].Destroy;
 end;
end;


Кажется что-то вроде того. Вопросы:
1. Стоит ли смешивать "record" c TStrings?
2. И что будет с памятью (выделением/освобождением)?
3. Не будет ли тут утечек памяти?
4. И что получится на выходе функции GetSomeType?

З.Ы.: Чую, что что-то не то, но что?


 
Тимохов ©   (2004-03-04 13:05) [1]


>  v.OtherValues := TStrings.Create

Так вообще спложные abstract error будут.
Заполнине такого списка работать не должно


 
Ega23 ©   (2004-03-04 13:16) [2]

Заранее размер такого рекорда не узнаешь. А значит, скорее всего AV получать будешь частенько.


 
YuRock ©   (2004-03-04 13:16) [3]


2. И что будет с памятью (выделением/освобождением)?
3. Не будет ли тут утечек памяти?


1. Утечек не будет - наоборот. Будет еще хуже. При попытке использовать SomeValue.OtherValues.Count программа "упадет", так как объект SomeValue.OtherValues удален еще в GetSomeType (на сколько я понял).

2. В GetSomeType вообще какая-то каша:

for i := 0 to SomeValue.OtherValues.Count - 1 do
begin
  SomeValue.OtherValues[i].Destroy;
end;

У кого вызывается Destroy? У типа String?


 
pasha_golub ©   (2004-03-04 13:37) [4]

Ega23 ©   (04.03.04 13:16) [2]
Это почему это не узнаешь?

Если {$H+}, то string = string[255], иначе указатель на начало строки, и плюс указатель на объект TStrings.

НО реализация конечно... В страшном сне не придумаешь.


 
BlackTiger ©   (2004-03-04 13:39) [5]

2YuRock Насчет Destroy, это я опечатался. Правильно конечно же

 SomeValue.OtherValues.Destroy;


Просто я немного упростил пример, а у автора обрабативался еще и динамический массив этих самых TSomeType"ов.

Меня вообще-то больше твой ответ (1) интересует. Как может сохраниться ссылка на TString в структуре, если структура сделана копией из оригинала, а в оригинале она позже очищена? Интересно, куда будет указывать Result.OtherValues?

На всякий случай я сказал этому человеку, что так делать не надо (к тому же проверять пришлось бы на живой системе).


 
YuRock ©   (2004-03-04 13:43) [6]

> куда будет указывать Result.OtherValues?

Pointer(Result.OtherValues) не будет равен nil, но память уже очищена, по-этому при использовании Result.OtherValues в лучшем случае (если будут использоваться только статические, умно написанные методы класса TStrings (типа Free)) ничего не произойдет.
Но как только дело дойдет до свойств или динамики - начнутся страшные вещи...


 
Ega23 ©   (2004-03-04 13:52) [7]

Ega23 ©   (04.03.04 13:16) [2]
Это почему это не узнаешь?

Если {$H+}, то string = string[255], иначе указатель на начало строки, и плюс указатель на объект TStrings.

НО реализация конечно... В страшном сне не придумаешь.

А если HugeStrings включено? Не-е-е, я уже давно только классы пишу, рекорды только для работы с файлами использую.



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

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

Наверх




Память: 0.49 MB
Время: 0.043 c
1-1078996562
vint45
2004-03-11 12:16
2004.03.28
Парсер DCU--файлов


1-1078763502
sentinel
2004-03-08 19:31
2004.03.28
Номер строки исходника


1-1078391606
@G
2004-03-04 12:13
2004.03.28
Bmp из DLL


3-1077280557
TATIANA
2004-02-20 15:35
2004.03.28
Как пометить несколько записей в GRID


1-1078831472
BPK
2004-03-09 14:24
2004.03.28
Как определять абстрактные методы?