![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Mach3 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 26.11.2005 Репутация: нет Всего: 2 |
Всем привет.
С указателями не знаком, посему сильно не пинать =)) Это сообщение отредактировал(а) Mach3 - 29.1.2012, 11:14 --------------------
Век живи - век учись... |
||||
|
|||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 7 Всего: 17 |
Тогда придётся подробно... Где-то в памяти создаётся объект типа TStringList и указатель на него присваивается переменной mlist. Вызывается функция calc_m и в неё передаётся этот указатель (ссылающийся на реальный объект в памяти). Значение переданного указателя присваивается переменной mass, теперь она ссылается на тот-же объект, что и mas. Объект, на который ссылаются обе эти переменные, уничтожается (освобождается память).
Уже уничтоженный объект пытаются уничтожить второй раз. |
|||
|
||||
| Mach3 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 26.11.2005 Репутация: нет Всего: 2 |
Примного благодарен.. +
P.S. А если в функции calc_m я создам объект mass:=tstringlist.Create; а уже потом mass:=mas; , то mass.Free; что высвободит? и в каком случае надо было бы использовать mlist.Free? Спасибо Это сообщение отредактировал(а) Mach3 - 29.1.2012, 14:18 --------------------
Век живи - век учись... |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 9 Всего: 58 |
Как-то так это должно происходить. Добавлено через 1 минуту и 6 секунд Ну а БелАмор пояснил все подробно ;) Это сообщение отредактировал(а) Keeper89 - 29.1.2012, 15:06 |
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 7 Всего: 17 |
Конструктор и указатели: Вы вызываете бригаду строителей (конструктор) и говорите: "Постройте мне дом", и даёте им пустую бумажку (неинициализированная переменная mass) со словами: "Когда построите дом, напишите сюда адрес и принесите мне". Они уходят, через некоторое время возвращаются и дают бумажку, на которой написано: "ул.Цветочная 55". Эта бумажка - ваша переменная, в которой записан указатель на объект (дом). Теперь вы можете нанять уборщицу, показать ей бумажку с адресом и попросить там убраться. Либо взять другую бумажку (переменную) и переписать в неё адрес из первой бумажки ("ул.Цветочная 55") и также дать уборщице. В любом случае уборка будет произведена в одном и том-же доме. Что было в вашем изначальном коде: Строители построили дом, принесли вам бумажку с адресом "ул.Цветочная 55", вы переписали надпись "ул.Цветочная 55" на другую бумажку, передали её в организацию "calc_m", там её зарегистрировали со входящим номером(именем) mas, начальник отдела в этой организации переписал адрес "ул.Цветочная 55" в другую бумажку (mass), сделали в доме по этому адресу уборку, полили цветы и т.д. После чего вызвали бульдозер и вручили водителю бумажку mass с адресом"ул.Цветочная 55" и сказали: "Дом снести". Бульдозер поехал по указанному адресу и снёс дом. Клерк написал отчёт о проделанной работе (уборка и полив цветов) и отправил его заказчику (функция вернула значение). Вы читаете отчёт, говорите: "всё окей", вызываете бульдозериста и даёте ему свою самую первую бумажку с адресом "ул.Цветочная 55" и говорите: "Дом снести". Бульдозерист говорит: "Будет сделано!" и уезжает. Через 20 минут он возвращается и с помощью нецензурной лексики объясняет, что по указанному адресу нет никакого дома, что там вообще строится автостоянка и его там чуть не побили... Теперь ваш второй вопрос: В организацию calc_m принесли бумажку mas, в которой было написано: "ул.Цветочная 55". Начальник отдела, недолго думая, вызвал строителей, дал им другую бумажку (mass), они построили дом, написали в эту бумажку "Абрикосовая 15" и вернули в начальнику отдела. Начальник отдела взял резинку, и в принесённой строителями бумажке стёр надпись "Абрикосовая 15", переписав в неё адрес "ул.Цветочная 55" из той бумажки (mas), которую ему дали вы. После этого он вызывает бульдозериста, даёт ему свою бумажку (mass), в которой стоит уже адрес "ул.Цветочная 55" и посылает сносить строение. Он смутно припоминает, что где-то должен быть ещё какой-то дом, но его адрес впомнить он не в силах. Дом на Абрикосовой простаивает и занимает место (утечка памяти). Если обработка в функции calc_m не портит данные в списке (например, только считает среднее количество гласных букв в строке, но ничего не удаляет и не добавляет), то я вообще не вижу необходимости создавать второй стринг-лист. Вы передаёте в функцию указатель на уже существующий стринг-лист, вот и работайте с ним. Если же данные корёжатся, то создаёте новый временный стринг-лист, в него копируете данные из первого ( mass.Assign(mas); ), делаете нужную обработку, получаете нужные результаты, уничтожаете этот временный стринг-лист, и возвращаете результаты. Добавлено через 8 минут и 59 секунд Посмотрите ещё ссылку: http://www.delphikingdom.com/asp/answer.asp?IDAnswer=57952 |
|||
|
||||
| Mach3 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 26.11.2005 Репутация: нет Всего: 2 |
Спасибо. Подробнее не найти =))
--------------------
Век живи - век учись... |
|||
|
||||
![]()
|
| Правила форума "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. |