Главная страница
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.04 c
3-1077633122
AlexWebIn
2004-02-24 17:32
2004.03.28
Программное определение внешних ключей.


3-1074854229
Silver_
2004-01-23 13:37
2004.03.28
SQL: SELECT ... WHERE ID_Fld IN --->MyArray<--- ???


3-1077874734
paul_k
2004-02-27 12:38
2004.03.28
Где бы пример найти


1-1078948644
SeriousSam
2004-03-10 22:57
2004.03.28
Как программно нажать какую либо кнопку (на клавиотуре)?


14-1078036776
Alexandra
2004-02-29 09:39
2004.03.28
Не в тему, но все же нужна помощь?