Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2009, 07:28   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Восклицание Проблема с указателями

Здравствуйте. Кто-нибудь встречался с такой проблемой? А именно: есть на форме компонент ListBox1 и Button1, в глобальных переменных задаю указатель
Код:
...
var
  p:^TListBox;
...
В обработчике онклик кнопки такой код:
Код:
New(p);
p:=@ListBox1;
p^.Items.Add('Test');
Dispose(p);
В выделенной строчке (при высвобождении памяти) выскакивает ошибка "Invalid Point Operation". Причем, если делать указатель p типа Integer, Real и т.п., то при операции Dispose(p) ошибки не возникает!
Объясните, пожалуйста, почему так и как этого избежать.
Заранее спасибо.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 13.03.2009, 07:52   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)обьясни а зачем ты выделяешь память под TListBox (New(p);)
а затем присваиваешь ему адресс уже существуещего Бокса(p:=@ListBox1;)?
2)TListBox это класс имеющий свои собственные конструкторы/деструкторы
и при динамической работе нужно работать с классами, при помощи конструкторов/деструкторов
а ты пытаеешься освободить память так, как будто это просто тип данных(Dispose(p);)


попробуй так:
Код:
p:=@ListBox1;
p^.Items.Add('Test');
p^.Free
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 13.03.2009 в 07:56.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.03.2009, 08:27   #3
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

TListBox это и есть указатель, память под него выделять не надо.

Код:
var
  p:TListBox;
...

New(p);
p:=ListBox1;
p.Items.Add('Test');
{p.free;//если выполнить эту строку то  уничтожится ListBox1, а саму по себе p уничтожать не надо!!!}
Сказал и загрустил от бесспорности своей правоты.

Последний раз редактировалось 0nni; 13.03.2009 в 08:41.
0nni вне форума Ответить с цитированием
Старый 13.03.2009, 08:37   #4
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

че вы постоянно спрашиваете, зачем указатель, зачем то, зачем сё - вам поставлен конкретный вопрос - на него и отвечайте, а не умничайте - человек немного не разобрался - ему надо помочь разобраться
capta1n вне форума Ответить с цитированием
Старый 13.03.2009, 08:46   #5
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Ок мб слишком резко начал, исправил.
Но он не недопонял а недоучил основы ооп. И решил работать в оо-й среде без необходимых знаний. Если дать ему ответ на вопрос - он ведь так всю жизнь делать и будет, а я считаю такие попытки над на корню рубить.
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 13.03.2009, 08:56   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Я понимаю концепции ООП. А зачем я это делаю:у меня в проге 2 листбокса на разных формах, всего 3 операции(удалить все записи, удалить выделенные, обновить). Когда записей много(более 3000), то vcl подвисает. Чтобы этого избежать, все эти процедуры формирую в потоке методом Synchronize. Указатели использую затем, чтобы поток "понял", с каким компонентом ему работать, т.е. эти 3 процедуры полностью завязаны на указателях.
Скажу сразу: ВСЕ РАБОТАЕТ НОРМАЛЬНО.
Собственно вопрос еще раз: КАК КОРРЕКТНО ВЫСВОБОДИТЬ ПАМЯТЬ УКАЗАТЕЛЯ ПРИ ЗАВЕРШЕНИИ ПРОГРАММЫ? смотреть мой пример кода в 1 посте. Про диспоуз понял. Но если я повторю весь код, но без выделенной строчки, как при завершении программы корректно высвободить память указателя p? Или компилятор высвобождает автоматически?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 13.03.2009, 09:11   #7
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Немного теории о памяти в Delphi :
http://www.rsdn.ru/article/Delphi/memmanager.xml
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 13.03.2009, 09:46   #8
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

3D Hunter, Ты немного не разобрался с динамическим распределением памяти.
New(var P:Pointer) Динамически выделяет память, размер которой определяется типом типизированного указателя Р, и возвращает указателю P адрес выделенной области памяти.
New НЕ ВЫДЕЛЯЕТ ПАМЯТЬ УКАЗАТЕЛЯ.

Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TMyRec = record
    Ind1: Integer;
    Ind2: Integer;
  end;
  PMyRec = ^TMyRec;

  TForm1 = class(TForm)
    procedure FormClick(Sender: TObject);
  end;

var VarPMyRec: ^TMyRec; // или : PMyRec
    VarTMyRec: TMyRec;
var
  Form1: TForm1;

implementation
{$R *.dfm}
procedure TForm1.FormClick(Sender: TObject);
var
  F: TForm1; // это тоже указатель на форму
begin
  New(VarPMyRec); // Выделяется память под новую запись TMyRec и адрес возвращается указателю
  VarPMyRec^.Ind1 := 5;
  Dispose(VarPMyRec); // выделенная под запись память освобождается

  VarPMyRec := @VarTMyRec; // указателю присваевается адрес записи VarTMyRec
  VarPMyRec^.Ind1 := 6;
  // освобождать не надо
  // можно присвоить nil
  VarPMyRec := nil;
  F := Form1; // указателю присваевается адрес формы
  F.Caption := 'Новый заголовок';
end;

end.
s.Creator вне форума Ответить с цитированием
Старый 14.03.2009, 06:55   #9
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Все, понял. Работает. Спасибо всем за помощь!
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с указателями Mango Помощь студентам 2 23.11.2008 10:33
Работа с указателями!!! HKBD Общие вопросы C/C++ 1 06.10.2008 07:52
Глюки с указателями _Инженер_ Общие вопросы Delphi 1 17.09.2008 20:20
проблема с указателями =\ shad0w Общие вопросы C/C++ 9 09.12.2007 03:36
Проблема с указателями novicer Общие вопросы Delphi 5 17.06.2007 00:21