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 ?
И вообще как это всё лучше всего делать ?


panov   (2002-06-26 14:33:00) [41]

>McSimm © (26.06.02 14:20)
Освобождения памяти от строки не произойдет
Почему? см. panov © (26.06.02 14:01)


Skier   (2002-06-26 14:27:00) [42]

> McSimm
Мне кажеться, что AStr^ := "hello, world !"
создаёт строку "hello, world !" в памяти, вот
если написать так :

AStr^ := "hello, world !";
а потом
AStr^ := "";
(далее всё по тексту)

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




McSimm   (2002-06-26 14:20:00) [43]

Память выделена 4 байта, освобождена - тоже 4 байта.
На что ссылается указатель в момент освобождения памяти известно только программисту, компилятору этого знать не нужно.

Освобождения памяти от строки не произойдет.
Какие доказательства тут можно привести? Могу предложить посмотреть ассемблерный код, сгенерированный компилятором.

>если на строку больше никто не ссылается
Этот аргумент здесь не подходит. "AStr^ := " не увеличивает ref.count строки. И тут все зависит от того способа каким это строка создана.


Anatoly Podgoretsky   (2002-06-26 14:19:00) [44]

panov © (26.06.02 14:01)
Шире, ключевое слово, часть языка, в отличии от других типов


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

> panov
"ссылки тут ни при чем"
Как ты не прав !
Я динамически создаю указатель на строку и потом
"говорю" Delphi разместить там ссылку на "hello, world !".

А FreeMem освобождает только указатель. или нет ?


VDen   (2002-06-26 14:15:00) [46]

2Skier © (26.06.02 14:12)
Вообще-то вы меня неправильно поняли. "Per rectum" - термин медицинский, означает "через задний проход". Можно сделать проще...


Kaban   (2002-06-26 14:14:00) [47]

>Речь о том что "в строке" (когда память под
>неё выделяет Delphi) храниться её длина и количество ссылок
>на неё, так вот если на строку больше никто не ссылается то она
>сносится из памяти.
Че то я в этом сильно сомневаюсь


panov   (2002-06-26 14:12:00) [48]

так вот если на строку больше никто не ссылается то она
сносится из памяти.

Почему это она сноситсяиз памяти?

Раз ты динамически создаешь переменную типа String, то пока ты ее принудительно не освободишь FreeMem, никуда память не освободится, и ссылки тут ни при чем.


Skier   (2002-06-26 14:12:00) [49]

> VDen
Да, да именно к звёздам !
А конкретно что-нибудь можешь сообщить ?


Skier   (2002-06-26 14:10:00) [50]

> panov
"Непонятно, о чем речь"
Речь о том что "в строке" (когда память под
неё выделяет Delphi) храниться её длина и количество ссылок
на неё, так вот если на строку больше никто не ссылается то она
сносится из памяти. Отсюда и мой вопрос.
И мне очень бы хотелось получить на него доказательный ответ.
Ну очень нужно !


Skier   (2002-06-26 14:05:00) [51]

> Kaban
Извини я если обидел (не хотел)
Просто разумная причина довольно глобальна, вот
я и эксперементирую по мелочам.
И я хочу использовать именно приведённый мной код.
Вот только у меня возникли вопросы...


VDen   (2002-06-26 14:04:00) [52]

Per rectum ad astera :))


:smile:   (2002-06-26 14:03:00) [53]

>Skier © (26.06.02 13:52)
>"Не будет" - это не ответ.
"Не будет" - это как раз ответ. На вопрос "будет ли..."

Просьбы о доказательствах я не видел.
Вообще-то это очевидная вещь.


Viewer   (2002-06-26 14:02:00) [54]

Ну так и докажи себе сам.
В цикле набери длину строки на 1Мег
s := s + "1234567890";
Посмотри на MemAvailable
Затем s := "";
И опять посмотри.


panov   (2002-06-26 14:01:00) [55]

будет ли освобождаться память выделенная Delphi под "hello, world !" ?

Да. Странно было бы, если бы память не освобождалась.
String/AnsiString стандартный тип в паскале и Delphi прекрасно умеет с ним работать.

При выполнении оператора присваивания
AStr^ := "hello, world !";
память динамически перераспределяется и
FreeMem(AStr) будет освобождать не 4 байта памяти, а именно столько, сколько выделено под "hello, world !".

Т.е. будет ли обнуляться счётчик ссылок на "hello, world !" ?
Непонятно, о чем речь.


Kaban   (2002-06-26 14:00:00) [56]

Пожалуйста
Вы хотите что-бы вам подсказали будет ли работать приведенный вами код, но в то же время отказываетесь назвать разумную причину его использования.
Я конечно понимаю, Герои всегда идут в обход.


Skier   (2002-06-26 13:55:00) [57]

> Kaban
ОГРОМНОЕ СПАСИБО !
Я никак не мог догадаться :)


Skier   (2002-06-26 13:52:00) [58]

> :smile:
"Не будет" - это не ответ.
Нужны доказательства !


Kaban   (2002-06-26 13:51:00) [59]

Приведенный вами код значительно упроститься, если вы будите использовать переменную типа string


Skier   (2002-06-26 13:49:00) [60]

> Игорь Шевченко
Код я весь привёл.
Мне нужен именно String (см. Вопрос)

будет ли освобождаться память выделенная Delphi под "hello, world !" ?
Т.е. будет ли обнуляться счётчик ссылок на "hello, world !" ?


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

Наверх

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