Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Invalid Pointer Operation 
:(
    Опции темы
Mach3
Дата 29.1.2012, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 26.11.2005

Репутация: нет
Всего: 2



Всем привет.
Код

function calc_m(mas : Tstringlist): integer;
var
mass:Tstringlist;
i,k,sum,mean:integer;
begin
mass:=mas;
pr_c:=mass.Count;
.....
result:= mean;
mass.Free;
end;



Код

var
mlist, rid: TStringList;
Begin
...
mlist:=tstringlist.Create;
if... then
 mlist.Add(rid[i])
m_pr:=calc_m(mlist);
mlist.Free // если пытаюсь высвободить память - Invalid Pointer Operation


С указателями не знаком, посему сильно не пинать =))

Это сообщение отредактировал(а) Mach3 - 29.1.2012, 11:14
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
БелАмор
Дата 29.1.2012, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



Цитата(Mach3 @  29.1.2012,  10:54 Найти цитируемый пост)
С указателями не знаком, посему сильно не пинать =))

Тогда придётся подробно...

Цитата(Mach3 @  29.1.2012,  10:54 Найти цитируемый пост)
mlist:=tstringlist.Create;

Где-то в памяти создаётся объект типа TStringList и указатель на него присваивается переменной mlist.

Цитата(Mach3 @  29.1.2012,  10:54 Найти цитируемый пост)
m_pr:=calc_m(mlist);

Вызывается функция calc_m и в неё передаётся этот указатель (ссылающийся на реальный объект в памяти).

Цитата(Mach3 @  29.1.2012,  10:54 Найти цитируемый пост)
mass:=mas;

Значение переданного указателя присваивается переменной mass, теперь она ссылается на тот-же объект, что и mas.

Цитата(Mach3 @  29.1.2012,  10:54 Найти цитируемый пост)
mass.Free;

Объект, на который ссылаются обе эти переменные, уничтожается (освобождается память).

Цитата(Mach3 @  29.1.2012,  10:54 Найти цитируемый пост)
mlist.Free // если пытаюсь высвободить память - Invalid Pointer Operation

Уже уничтоженный объект пытаются уничтожить второй раз.
PM   Вверх
Mach3
Дата 29.1.2012, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 26.11.2005

Репутация: нет
Всего: 2



Примного благодарен.. +
P.S. А если в функции calc_m  я создам объект mass:=tstringlist.Create; а уже потом mass:=mas; ,
то mass.Free; что высвободит? и в каком случае надо было бы использовать mlist.Free?
Спасибо


Это сообщение отредактировал(а) Mach3 - 29.1.2012, 14:18
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
Keeper89
Дата 29.1.2012, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Код

function calc_m(mas : Tstringlist): integer;
var
mass:Tstringlist;
i,k,sum,mean:integer;
begin
mass:=mas;
pr_c:=mass.Count;
.....
result:= mean;
end;
...

mlist:=tstringlist.Create;
try
  if... then
   mlist.Add(rid[i])
  m_pr:=calc_m(mlist);
finally
  FreeAndNil(mlist)
end;

Как-то так это должно происходить.

Добавлено через 1 минуту и 6 секунд
Ну а БелАмор пояснил все подробно ;)

Это сообщение отредактировал(а) Keeper89 - 29.1.2012, 15:06


--------------------
PM MAIL WWW   Вверх
БелАмор
Дата 29.1.2012, 15:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



Цитата(Mach3 @  29.1.2012,  14:10 Найти цитируемый пост)
P.S. А если в функции calc_m  я создам объект mass:=tstringlist.Create; а уже потом mass:=mas; ,
то mass.Free; что высвободит? и в каком случае надо было бы использовать mlist.Free?

Конструктор и указатели:
Вы вызываете бригаду строителей (конструктор) и говорите: "Постройте мне дом", и даёте им пустую бумажку (неинициализированная переменная mass) со словами: "Когда построите дом, напишите сюда адрес и принесите мне".
Они уходят, через некоторое время возвращаются и дают бумажку, на которой написано: "ул.Цветочная 55". Эта бумажка - ваша переменная, в которой записан указатель на объект (дом). Теперь вы можете нанять уборщицу, показать ей бумажку с адресом и попросить там убраться. Либо взять другую бумажку (переменную) и переписать в неё адрес из первой бумажки ("ул.Цветочная 55") и также дать уборщице. В любом случае уборка будет произведена в одном и том-же доме.

Что было в вашем изначальном коде:
Строители построили дом, принесли вам бумажку с адресом "ул.Цветочная 55", вы переписали надпись "ул.Цветочная 55" на другую бумажку, передали её в организацию "calc_m", там её зарегистрировали со входящим номером(именем) mas, начальник отдела в этой организации переписал адрес "ул.Цветочная 55" в другую бумажку (mass), сделали в доме по этому адресу уборку, полили цветы и т.д. После чего вызвали бульдозер и вручили водителю бумажку mass с адресом"ул.Цветочная 55" и сказали: "Дом снести". Бульдозер поехал по указанному адресу и снёс дом. Клерк написал отчёт о проделанной работе (уборка и полив цветов) и отправил его заказчику (функция вернула значение).
Вы читаете отчёт, говорите: "всё окей", вызываете бульдозериста и даёте ему свою самую первую бумажку с адресом "ул.Цветочная 55" и говорите: "Дом снести". Бульдозерист говорит: "Будет сделано!" и уезжает. Через 20 минут он возвращается и с помощью нецензурной лексики объясняет, что по указанному адресу нет никакого дома, что там вообще строится автостоянка и его там чуть не побили...

Теперь ваш второй вопрос:
Цитата(Mach3 @  29.1.2012,  14:10 Найти цитируемый пост)
P.S. А если в функции calc_m  я создам объект mass:=tstringlist.Create; а уже потом mass:=mas; ,
то mass.Free; что высвободит? и в каком случае надо было бы использовать mlist.Free?

В организацию calc_m принесли бумажку mas, в которой было написано: "ул.Цветочная 55".
Начальник отдела, недолго думая, вызвал строителей, дал им другую бумажку (mass), они построили дом, написали в эту бумажку "Абрикосовая 15" и вернули в начальнику отдела.
Начальник отдела взял резинку, и в принесённой строителями бумажке стёр надпись "Абрикосовая 15", переписав в неё адрес "ул.Цветочная 55" из той бумажки (mas), которую ему дали вы.
После этого он вызывает бульдозериста, даёт ему свою бумажку (mass), в которой стоит уже адрес "ул.Цветочная 55" и посылает сносить строение. Он смутно припоминает, что где-то должен быть ещё какой-то дом, но его адрес впомнить он не в силах. Дом на Абрикосовой простаивает и занимает место (утечка памяти).

Цитата(Mach3 @  29.1.2012,  14:10 Найти цитируемый пост)
в каком случае надо было бы использовать mlist.Free?

Если обработка в функции calc_m не портит данные в списке (например, только считает среднее количество гласных букв в строке, но ничего не удаляет и не добавляет), то я вообще не вижу необходимости создавать второй стринг-лист. Вы передаёте в функцию указатель на уже существующий стринг-лист, вот и работайте с ним. Если же данные корёжатся, то создаёте новый временный стринг-лист, в него копируете данные из первого ( mass.Assign(mas);  ), делаете нужную обработку, получаете нужные результаты, уничтожаете этот временный стринг-лист, и возвращаете результаты.

Добавлено через 8 минут и 59 секунд
Посмотрите ещё ссылку:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=57952

PM   Вверх
Mach3
Дата 30.1.2012, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 26.11.2005

Репутация: нет
Всего: 2



Спасибо. Подробнее не найти =))
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0682 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.