Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

Подозрительная конструкция какая-то. (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.037 c
7-1072549718
Nick_Omsk
2003-12-27 21:28
2004.03.28
USB в Delphi


14-1077799448
Polevi
2004-02-26 15:44
2004.03.28
Интерфейс пользователя


7-1072876337
Alibaba
2003-12-31 16:12
2004.03.28
Thread


4-1073991114
Sour
2004-01-13 13:51
2004.03.28
чужой RichEdit


4-1073995115
Chaynik
2004-01-13 14:58
2004.03.28
Как использовать 16 битную DLL в 32 битном приложении





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский