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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2012, 17:17   #1
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию Адресса классов в памяти

Здраствуйте, уважаемые люди. Есть такой вот код(допустим):
Код:
procedure TForm2.FormCreate(Sender: TObject);
var
  Data1, Data2: TObject;
begin
  Data1 := TObject.Create;
  Data2 := Data1;

  ListBox1.Items.Add(IntToStr(Integer(@Data1)));
  ListBox1.Items.Add(IntToStr(Integer(@Data2)));

  ListBox1.Items.Add(IntToStr(Integer(Data1)));
  ListBox1.Items.Add(IntToStr(Integer(Data2)));

  Data1.Free;
end;
В первых двух строчках ListBox-а адреса с разницой 4 (т.с. как будто это адреса экземпляров в памяти, разница то в 4 байта т.с. как указатель), а вот вторые две строчки показывают одинаковые, отличные от предыдущих адреса, как будто это адрес вызова конструктора или что то типа этого т.к. Data2 := Data1 что оба ссылаются на один конструктор. Короче, прошу полного объяснения что к чему!))

Хотелось бы узнать

Последний раз редактировалось RuVarez; 07.08.2012 в 17:20.
RuVarez вне форума Ответить с цитированием
Старый 07.08.2012, 17:29   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

обьекты типа class храняться уже по указателю.
потому в первом случае вы взяли адресс переменной хранящей адрес(а она на стеке, разница 4 байта(размер указателя) ибо идут подрят)

во втором случае вы уже взяли значение указателя на обьект, то есть то что надо.
а оно одно и тоже как и должно быть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.08.2012, 17:36   #3
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Т.с. при вызове конструктора класса выделяется памяти, а переменная всеволишь указывает на этот участок выделеной памяти, так?
Но при этом она (переменная) имеет свой адрес в стеке?
RuVarez вне форума Ответить с цитированием
Старый 07.08.2012, 17:40   #4
GSirr
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 42
По умолчанию

Цитата:
Data2 := Data1;
Добавлю, что при этой операции копируются не данные класса, а указатель на облать памяти данного класса.

В этом легко убедится, вызвав Invalid Poiter operation следующим образом:
Код:
procedure TForm2.FormCreate(Sender: TObject);
var
  Data1, Data2: TObject;
begin
  Data1 := TObject.Create;
  Data2 := Data1;

  ListBox1.Items.Add(IntToStr(Integer(@Data1)));
  ListBox1.Items.Add(IntToStr(Integer(@Data2)));

  ListBox1.Items.Add(IntToStr(Integer(Data1)));
  ListBox1.Items.Add(IntToStr(Integer(Data2)));

  Data1.Free;
  Data2.Free; // Тут Invalid Poiter operation
end;
GSirr вне форума Ответить с цитированием
Старый 07.08.2012, 17:46   #5
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Цитата:
Сообщение от GSirr Посмотреть сообщение
Добавлю, что при этой операции копируются не данные класса, а указатель на облать памяти данного класса.

В этом легко убедится, вызвав Invalid Poiter operation следующим образом:
Код:
procedure TForm2.FormCreate(Sender: TObject);
var
  Data1, Data2: TObject;
begin
  Data1 := TObject.Create;
  Data2 := Data1;

  ListBox1.Items.Add(IntToStr(Integer(@Data1)));
  ListBox1.Items.Add(IntToStr(Integer(@Data2)));

  ListBox1.Items.Add(IntToStr(Integer(Data1)));
  ListBox1.Items.Add(IntToStr(Integer(Data2)));

  Data1.Free;
  Data2.Free; // Тут Invalid Poiter operation
end;
Спасибо это я понимаю!
RuVarez вне форума Ответить с цитированием
Старый 07.08.2012, 18:15   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Т.с. при вызове конструктора класса выделяется памяти, а переменная всеволишь указывает на этот участок выделеной памяти, так?
Но при этом она (переменная) имеет свой адрес в стеке?
да.

переменная типа класс(TObject как пример) это переменная-указатель.
ей значение указывает на данные, а её адрес это адрес не данных, а адрес указателя.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.08.2012, 18:21   #7
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Всем спасибо тему можно закрывать
RuVarez вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение IP адресса Bayazet Работа с сетью в Delphi 7 27.12.2012 03:47
Нахождение адресса пикселя. ssovec PHP 2 04.04.2011 12:23
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18
определение ip-адресса Ермоленко Виктор Помощь студентам 0 02.06.2008 13:44