![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Ibragim |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 28.9.2004 Где: Киев Репутация: нет Всего: нет |
Вечер добрый.
Вот появился следующий вопросик. Есть функция
Потом если я пишу
то все на вид работает. Но вот впрос - не опасен ли такой код? На С++ например в данном случае передача прошла бы только указателя на Res, а сама Res локальная, в функции F. Поэтому даже если мы бы и получили 'Test' на выходе - это говорило бы только о том, что память, ранее использованная под Res еще не освободилась. В связи с этим вопрос: При a := F; происходит КОПИРОВАНИЕ всего содержимого объектов, или только присвоение указателей? |
||||
|
|||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Происходит присвоение УКАЗАТЕЛЯ, а тот объем памяти, который занимал TStringList до этого - теряется, т.е. происходит утечка памяти. В функции у тебя происходит выделение памяти для класса и присвоение результату функции указателя на этот выделенный объем. Таким образом - такой вариант кода НЕВЕРЕН.
-------------------- ![]() |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Естественно происходит присвоение указателя.
А вот создавать a совсем не нужно - ты его создаёшь функцией. Если убрать создание вне функции и добавить уничтожение после использования - вот тогда будет верно.
А вообще правильнее делать не так. Нужно создать лист самому, отдать его процедуре на заполнение и потом с ним работать и уничтожить. Создавать лист в функции не хорошо - код хуже читается - при просмотре не очевидно, где он создан. |
|||
|
||||
| Ibragim |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 28.9.2004 Где: Киев Репутация: нет Всего: нет |
Ок, что общественность скажет по поводу такого кода?
По задумке должно если объект FormsList еще не создан, создавать. На первый взгляд так и получается. Нет подводных камней? |
|||
|
||||
| Bose |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
насколько я понимаю, такой код генерирует утечку памяти.
создаёт объект TStringList и присваивает указатель на него пременной a а строка
создаёт ещё один объект TStringList и присваивает указатель на него пременной a, перезаписав указатель на предыдущий объект. если я ошибаюсь, прошу меня поправить.
в принципе так и получается. Но если вдруг исключение возникнет не из-за того, что FormsList не существует, а по какой-либо другой причине(невероятное предположение), то может произойти утечка памяти. если бы это писал я, то писал бы так:
|
||||||||||||
|
|||||||||||||
| aktuba |
|
||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Правильнее так:
Но и этот вариант не самый правильный. Самое правильное следующее:
-------------------- ![]() |
||||
|
|||||
| Ibragim |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 28.9.2004 Где: Киев Репутация: нет Всего: нет |
ОК. Спасибо. Все понятно, вопрос закрыт.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |