Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамическое создание строк


Страницы:   1 2 3 4

Skier ©   (2002-06-26 13:18:00) 

Господа, мне нужно динамически создавать строки
(не PChar, а именно String(!) )

Я делаю что-то вроде этого :

.......................
type
PString = ^String;
var
AStr := AllocMem(4);
AStr^ := "hello, world !"
FreeMem(AStr, 4);
.......................

Вроде бы всё работает, но что-то меня
терзают смутные сомненния : не происходит ли memory leak ?
И вообще как это всё лучше всего делать ?


McSimm   (2002-06-27 12:38:00) [1]

>Kaban © (27.06.02 11:02)
Понятно.
Нет, ножик я не ел :)


Kaban   (2002-06-27 11:02:00) [2]

2 McSimm
"Обитаемый остров" читал


Skier   (2002-06-26 18:45:00) [3]

>valery_f
"...на сообразительность компилятора"
Да ! Именно в этом я и хотел разобраться (см.
Skier © (26.06.02 15:19) )


valery_f   (2002-06-26 18:27:00) [4]

Народ, похоже мы слишком далеко уехали... В исходном примере динамически создается указатель на указатель (!), и к динамическому созданию строк это отношения вообще никакого не имеет. Это больше напоминает проверку на сообразительность компилятора - догадается ли он, что на ту строку кто-то косвенно ссылается или нет.

Я бы предложил попробовать уточнить исходную постановку задачи и разобраться - стОит ли лезть в эти дебри и изобретать велосипед, путаясь в том - строку ли мы уничтожаем, указатель на нее или указатель на указатель на нее... :)


McSimm   (2002-06-26 18:11:00) [5]

Я не говорил что не работает. Можно GetMem-FreeMem использовать, но с принудительной очисткой строки либо присвоением "", любо вызовом finalize.

Вариант с New-Dispose я привел как универсальный способ для хранения различных типов данных (строки, варианты и пр.)
Dispose освобождением этих типов сам озабочен :)
и не надо будет об этом заботиться :
---
For global variables, local variables, objects, and dynamic variables deallocated using Dispose, the compiler generates code that finalizes all long strings, variants, and interfaces contained by the variablewhen the instance is destroyed.
---


Skier   (2002-06-26 17:25:00) [6]

>McSimm
Извини, что достаю, но всё-таки хочется до конца
разобраться.

А чем в моём случае отличаются New от GetMem(4) ?
Т.е. почему код не работает если использовать GetMem ??


McSimm   (2002-06-26 17:15:00) [7]

и в этом случае
память не будет утекать ? Ты уверен ??


- Если каждому New будет соответствовать Dispose,
- Если в создаваемой record не будет новых заморочек с указателями (типа record A: Integer; P: PString end)
- Если не будет ошибок
То память исчезать не будет. Уверен.

PS
Хотя я, как и любой человек, могу быть уверенным в неправильных вещах и нет информации ценнее собственного опыта :)


McSimm   (2002-06-26 16:55:00) [8]

2Толик
Зависит от того что считать стандартным string"омShortString или AnsiString. :)

Я привык считать стандартным AnsiString. Т.к. считаю что ShortString оставлен только для совместивмости.

В любом случае из обсуждения легко понять что речь идет именно об AnsiString


Skier   (2002-06-26 16:54:00) [9]

> McSimm
New(AStr) динамически создаёт строку и в этом случае
память не будет утекать ? Ты уверен ??

>Толик
Похоже на правду...


Толик   (2002-06-26 16:51:00) [10]

насчёт счётчика ссылок в строках:
читаем делфёвые хелпы:

1. String types:

In the default {$H+} state, the compiler interprets string (when it appears without a bracketed number after it) as AnsiString. Use the {$H–} directive to turn string into ShortString.

т.е. по умолчанию string это не string а ansistring.

2. Short strings:

A ShortString is 0 to 255 characters long. While the length of a ShortString can change dynamically, its memory is a statically allocated 256 bytes; the first byte stores the length of the string, and the remaining 255 bytes are available for characters.

так что нету счётчика ссылок у стандартного string"а, только если ansistring...


McSimm   (2002-06-26 16:46:00) [11]

>Kaban © (26.06.02 16:13)
> а ник у тебя часом не оттуда же :-)

Вообще-то нет.
Не припомню, а что там такое было?


McSimm   (2002-06-26 16:45:00) [12]

>Буду искать другие подходы.

var
AStr: PString;
AVar: PVariant;
AAnyRec: PMyRec;
begin
New(AStr) ; // (AVar, AAnyRec)
AStr^ := ... // (AVar, AAnyRec)
...
Dispose(AStr); // (AVar, AAnyRec)


Skier   (2002-06-26 16:41:00) [13]

>McSimm
"Это удобный класс для массивов строк."
Я это давно заметил :))
Ну в общем, ладно, я понял что в моём коде память течёт-таки.
Буду искать другие подходы.



McSimm   (2002-06-26 16:37:00) [14]

>Skier © (26.06.02 13:18)
OP - Object Pascal. Лень набирать было :)

Вариантов много. Для строк удобно использовать TStringList. Для общего случая можно использовать record и/или TList. Можно использовать динамические массивы.
Опять же, заменив AllocMem-FreeMem на New-Dispose можно решить проблему с минимальными затратами.

Что рассказать про TStringList? Это удобный класс для массивов строк.


Skier   (2002-06-26 16:29:00) [15]

>McSimm

1) ОР - это чаво ?
2) Про TStringList расскажешь ?


McSimm   (2002-06-26 16:25:00) [16]

>Skier © (26.06.02 16:18

Из вышесказанного следует, что тебя должны беспокоить две проблемы.
1. Будет ли утечка памяти
2. Проживет ли строка так долго как мне этого хотелось бы.

Ты совсем упускаешь из виду вторую проблему. Как я уже говорил легко написать такой код, когда строка будет уничтожаться менеджером строк OP не тогда когда этого хочется и ссылки AStr будут хранить указатели на свободную (или перераспределенную) память.

Поэтому лучше изменить подход. Или добиться полного взаимопонимания с диспетчером строк OP.


Skier   (2002-06-26 16:23:00) [17]

>McSimm
Буду очень признателен если расскажешь
про свой подход через TStringList.
Для варианта с использованием :
1) PString = ^String
2) PVariant = ^Varinant


Skier   (2002-06-26 16:18:00) [18]

> valery_f
Ну так как насчёт memory leak ?


McSimm   (2002-06-26 16:16:00) [19]

>Skier © (26.06.02 13:18)
Прошу понять меня правильно.
Мои высказывания носили теоретический характер, не привязанно к данной конкретной задаче. Т.е. вопрос интересен в смысле понимания внутренних механизмов работы.

Раз речь зашла о том как же лучше сделать - мой совет, использовать TStringList.
Либо PChar с приведением типов, как посоветовал Толик.

Кстати, Толик, - счетчик у строк есть.


Skier   (2002-06-26 16:14:00) [20]

> McSimm
В последнем куске кода будет memory leak как считаешь ?
Или это те же груши только в профиль :)


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо