Текущий архив: 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.46 MB
Время: 0.025 c