Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];

Вниз

Ошибка в коде, который раньше работал.   Найти похожие ветки 

 
RWolf ©   (2009-11-05 10:58) [40]

в Дельфи Bitmap:TBitmap — на самом деле указатель на объект.
Строкой DM1.ImageList1.GetBitmap(32, Bitmap1); ты присваиваешь ему адрес реально существующего объекта, который хранится в ImageList1. Кроме того, этим же объектом пользуется процедура ListBox1DrawItem. Кода ты выполняешь Bitmap.Free, объект уничтожается, и при обращеннии по его адресу из другого места программы имеем глюк.


 
kyn66 ©   (2009-11-05 10:59) [41]


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


Ну я как и предполагал. Но удалив один указатель, второй-то должен остаться действующим? Как тогда правильно уничтожать такие объекты(применительно к данной ситуации), чтобы они не повисли в памяти?


 
RWolf ©   (2009-11-05 11:05) [42]


> Но удалив один указатель, второй-то должен остаться действующим?

Удаляются не указатели, а объекты, на которые они указывают.

> Как тогда правильно уничтожать такие объекты

.Free, как и любые другие. Просто надо следить за указателями; удалил объект — больше не пользуйся указателями на него.


 
Сергей М. ©   (2009-11-05 11:05) [43]


> тоже объявлена как и у меня переменная Bitmap и после отрисовки
> она уничтожается


При Bitmap.Free уничтожается не переменная, а объект, ранее созданный при вызове конструктора TBitmap.Create, указатель на который записан в переменную Bitmap при присвоении в строке Bitmap := TBitmap.Create.
Сама же лок.переменная Bitmap уничтожается (вместе с ее содержимым, каким бы оно  ни было) при завершении работы метода ListBox1DrawItem (читай - при выполнеии оператора end).
И поскольку содержимое переменной Bitmap нигде никуда не копировалось в ходе работы метода, созданный объект "умер", равно как и единственная существовавшея ссылка на него в переменной Bitmap.
Отныне не существует ни самого объекта, ни ссылок на него.

В твоем же случае ты еще при жизни своего объекта сделал три копиии ссылки на него, после чего убил объект и переменную, с которой были сделаны копии. Но копии-то ссылок остались ! И сразу же после уничтожения объекта они стали указывать в никуда, ибо объекта по адресу, на который о ни по-прежнему указывают, объекта уже нет.


 
Сергей М. ©   (2009-11-05 11:07) [44]


> удалив один указатель, второй-то должен остаться действующим?


Ну что значит "действующим" ?
Да, он продолжает указывать на некий адрес в памяти, по которому раньше жил объект, но по которому этого объекта уже нет, ибо ты уничтожил его своими руками.


 
kyn66 ©   (2009-11-05 11:20) [45]

Очень популярно разъяснено. Понятно, хоть десять переменных привяжи к одному объекту и при уничтожении хотя-бы одной переменной с объектом, все остальные зависнут в воздухе. Я так понял? Так как же мне поступить правильно? Как их уничтожать правильно?


> В твоем же случае ты еще при жизни своего объекта сделал
> три копиии ссылки на него,


Почему 3 ? Вроде 2 должно быть.


 
Сергей М. ©   (2009-11-05 11:29) [46]


> при уничтожении хотя-бы одной переменной с объектом, все
> остальные зависнут в воздухе


Да не переменной, а самого объекта !


> Почему 3 ? Вроде 2 должно быть.


>     st.AddObject("первая запись", Bitmap1); //раз копия
>     st.AddObject("вторая запись", Bitmap1); //два копия
>     st.AddObject("третья запись", Bitmap1); //три копия


 
RWolf ©   (2009-11-05 11:36) [47]

смотри:

Bitmap1 := TBitmap.Create; //создали пустой TBitmap, Bitmap1 — указатель №1 на него
ListBox1.Clear;
for i := 1 to KolLotery do
 begin
   DM1.ImageList1.GetBitmap(32, Bitmap1); //скопировали содержимое объекта из другого TBitmap
   st.AddObject("первая запись", Bitmap1); //запомнили указатель №1 на TBitmap
   st.AddObject("вторая запись", Bitmap1); //запомнили указатель №2
   st.AddObject("третья запись", Bitmap1); //запомнили указатель №3
 end;
ListBox1.Items.AddStrings(st);
st.Free;
Bitmap1.Free; //и прибили объект! всё, указатели невалидны.


 
kyn66 ©   (2009-11-05 11:39) [48]


> Да не переменной, а самого объекта !


Ну я и имел это ввид (переменной с объектом), пардон за неграмотные выражения. Я решил 2 раза потом, что 1-й раз - DM1.ImageList1.GetBitmap(32, Bitmap1);, а второй, когда Bitmap := TBitmap(ListBox1.Items.Objects[Index]); Вот и решил, что у меня фигурируют две независимые переменные, точнее ссылки на объекты. Сергей, сейчас я понял про связь с объектами. Так как разрулить полюбовно ситуацию с уничтожением объекта. Может так и оставить, уничтожив глобальную по закрытии главной формы? А во втором блоке уничтожение убрать?


 
Сергей М. ©   (2009-11-05 11:47) [49]


> kyn66 ©   (05.11.09 11:39) [48]


Да как угодно.
Главное понимать, что в каждый момент времени творится с самим объектом и потенциально существующими ссылками на него.


 
kyn66 ©   (2009-11-05 11:50) [50]

Ок!

2Сергей М.
2RWolf


СПАСИБО за помощь!



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.023 c
15-1255765672
Virgo_Style
2009-10-17 11:47
2009.12.20
Раздача слонов - Paragon Partition Manager 9.5 Professional


2-1256902521
Drowsy
2009-10-30 14:35
2009.12.20
"Откат" значений генератора.


2-1257108265
Ivan
2009-11-01 23:44
2009.12.20
GET и амперсанд


2-1257157792
yantar92
2009-11-02 13:29
2009.12.20
Глюки с вызовом процедуры по ссылке


15-1256063303
TUser
2009-10-20 22:28
2009.12.20
Вклад метагеномики в микробиологию, экологию и медицину





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский