Форум: "Потрепаться";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
ВнизДинамический объект. Найти похожие ветки
← →
Shopot © (2004-05-08 22:50) [0]Как я понимаю Дельфи-это фигня(извините модераторы, но не могу...)! Я не могу определить, существует объект
в памяти или нет. В C++ это сделать 2 секунды. Но на дельфи
писать меньше, а ошибок больше. Вот например, мне надо определить существует ли
BMP типа TBitMap, или мне надо делать BMP := TBitMap.Create. Ведь если
он не существует BMP все равно не = nil, тогда как определить
есть ли он вообще?
← →
Palladin © (2004-05-08 23:00) [1]следить за собой надо... и контролировать себя...
инициализировать любой объект всегда nil, и при free тоже выставлять в nil... или пользоватся FreeAndNil, тогда приучишь себя к дисциплине кодирования...
← →
Algol (2004-05-08 23:14) [2]
> Shopot
А как это определить в C++ ?
← →
Gero © (2004-05-08 23:19) [3]
> В C++ это сделать 2 секунды
Это команда для определения так долго выполняется?
← →
TUser © (2004-05-09 05:43) [4]Ой, а я на Делфи не могу икону в трей упихать. Щас модераторы спать лягут, я скажу все, что я об этом Делфи думаю.
PS. Это не у тебя оператор присвоения недавно к краху системы приводил? Тоже Борланд виноват, аднзначно.
← →
mike-d © (2004-05-09 09:01) [5]> Shopot © (08.05.04 22:50)
> существует ли
> BMP типа TBitMap, или мне надо делать BMP := TBitMap.Create.
> Ведь если
> он не существует BMP все равно не = nil, тогда как определить
> есть ли он вообще?
(ИМНО) Например так...if Assigned(BMP) then
begin
if BMP.InstanceSize <> 0 then TBitMap.Create;
end
else BMP := TBitMap.Create;
← →
mike-d © (2004-05-09 09:05) [6]Сорри, ошибочка вкралась :)
Конечно же...if Assigned(BMP) then
begin
if BMP.InstanceSize = 0 then TBitMap.Create;
end
else BMP := TBitMap.Create;
← →
Palladin © (2004-05-09 10:05) [7]Дайте мне красный карандаш на пять сек.
← →
Palladin © (2004-05-09 10:14) [8]
> mike-d © (09.05.04 09:05) [6]
Потрудитесь шаг за шагом объяснить Ваш код. В подробностях. А так же предпосылки его появления.
← →
Юрий Зотов © (2004-05-09 10:36) [9]> Shopot © (08.05.04 22:50)
> Как я понимаю Дельфи-это фигня(извините модераторы, но не
> могу...)! Я не могу определить, существует объект
> в памяти или нет.
Безусловно, Вы правы. Это именно Delphi виновата в том, что Вы чего-то не можете сделать. А когда человек не умеет управлять автомобилем - то это автомобиль плохой.
> mike-d © (09.05.04 09:01) [5]
> mike-d © (09.05.04 09:05) [6]
1. К сожалению, в Вашем ответе сразу 2 грубых ошибки.
2. Если бы Вы сначала проверили свой ответ САМИ, то не было бы причин на это указывать.
← →
mike-d © (2004-05-09 12:21) [10]> Юрий Зотов © (09.05.04 10:36) [9]
Да, согласен - облажался. Буду исправляться...
← →
Adder © (2004-05-09 17:11) [11]Всё фигня, кроме пчёл (с)
← →
Anatoly Podgoretsky © (2004-05-09 17:35) [12]Adder © (09.05.04 17:11) [11]
и модератора женщины
← →
Игорь Шевченко © (2004-05-09 18:41) [13]И все-таки, было бы интересно услышать начальника транспортного цеха.
← →
Anatoly Podgoretsky © (2004-05-09 19:38) [14]Сейчас доложит.
← →
Shopot © (2004-05-09 21:14) [15]По-моему никто из вас никогда серьезно с памятью не работал.
Забыли вы старый добрый ДОС, где просто потеешь, чтобы наскребсти последние 2-3 байта и ввести новую возможность в программу. Вы прыгнули сразу ни Винды, типа 32 бита, плоская модель памяти, засирай - нехочу, а если сам не засрешь, то за тебя все сделает великий и могучий компилятор! А вот Винды поперли на ООП не обдумав как этим вообще можно пользоваться. Поэтому даже в 95 Винде более 2000 ошибок, которые автоматически переходят в твою прогу. А ты сидишь материшся и ничего не можешь сделать, т.к. пользователь хочет программу под Виндовс. Может это и не Дельфи такая плохая, может я чего не понимаю, но объясните мне ПОЖАЛУЙСТА, как определить создан объект или нет (допустим создается он автоматически, самой системой) если у меня есть переменная экземпляра этого объекта.
>> mike-d
Сорри, ошибочка вкралась :)
Конечно же...
if Assigned(BMP) then
begin
if BMP.InstanceSize = 0 then TBitMap.Create; // <<<< error
end
else BMP := TBitMap.Create
А ты сам попробуй, работает?
← →
Nous Mellon © (2004-05-09 21:18) [16]
> По-моему никто из вас никогда серьезно с памятью не работал.
Да конечно куда до тебя нашим мастерам...
← →
Palladin © (2004-05-09 21:19) [17]И все в пустую...
---
Помните! Чем выше качество вопроса, тем выше качество ответа.
← →
Palladin © (2004-05-09 21:22) [18]Я только не понял при чем тут за<этосамое> памяти... принцип который высказан в [1] справедлив для любого ЯП, ну кроме может тех где есть GC, но и там тоже лучше им следовать, в пределах разумного. Если утекает память нечего ЯП хаять, как уже сказано, в этом случае дисциплина кодирования нулевая.
---
Помните! Чем выше качество вопроса, тем выше качество ответа.
← →
Mihey © (2004-05-09 21:26) [19]2 Shopot:
Да шадап уже...
var a: TBitmap;
... OnCreate
a := nil;
... Some SuppaPuppaProcedures
If (n > 0) and BillGatesStinks then a := TBitmap.Create else ...
... Добралися
If a = nil then a := TBitmap.Create else ShowMessage("2-то зачем?");
← →
TCrash © (2004-05-09 21:30) [20]Рулез, так и нужно
← →
Игорь Шевченко © (2004-05-09 21:51) [21]Shopot © (09.05.04 21:14)
Жаль, что мы так и не услышали начальника транспортного цеха.
Так как ты на С++ определяешь, чудо ?
← →
Palladin © (2004-05-09 21:54) [22]
> , чудо ?
:)))
---
Помните! Чем выше качество вопроса, тем выше качество ответа.
← →
Юрий Зотов © (2004-05-09 22:11) [23]> Shopot © (09.05.04 21:14) [15]
Что касается правильного и полного ответа, то он был дан в первом же посте. И если человек хотя бы понимает, что такое указатели и динамическая память, то такого ответа ему должно было быть более, чем достаточно.
Поэтому совершенно непонятно, почему же для программиста, серьезно работавшего с памятью, не забывшего старый добрый ДОС, где ему приходилось просто потеть, чтобы наскрести последние 2-3 байта и ввести новую возможность в программу - почему же для ТАКОГО программиста простейшая задачка вдруг стала проблемой?
Ох, что-то тут не сладывается. Поскольку для программиста, который ДЕЙСТВИТЕЛЬНО умеет работать памятью это даже не вопрос - определить, создан ли объект, или нет.
Может быть, проблема в этом:
> А вот Винды поперли на ООП
Или вот в этом:
> допустим создается он автоматически, самой системой
Оказывается, Windows - это не только объектно-ориентированная система, но она еще и объекты Delphi умеет создавать - сама и автоматически. Ох, что-то тут снова не складывается.
А еще непонятно, почему этот программист вдруг начинает гнуть пальцы и катить баллоны на Delphi, на Windows, на других... в общем, на все и всех, кроме самого себя.
Может быть, ГЛАВНАЯ проблема как раз в этом и есть? Если задуматься.
=============================================
С трудом сдержался...
:о)
← →
default © (2004-05-10 09:53) [24]function IsInvalidPointer(Obj: TObject): Boolean;
begin
Result := True;
try
FreeMem(Pointer(Obj));
except
Result := False
end;
end;
я нисколько не уверен в том что это "хороший и даже работающий" способ
в одном нет сомнений - FreeMem распознаёт "убитый указатель"
а в том что при этой проверке FreeMem ничего плохого не творит никакой уверенности нет, но ошибок у меня не возникало с использованием объекта после такой проверки(когда он не был убит ещё)
← →
Algol (2004-05-10 10:13) [25]
> default © (10.05.04 09:53) [24]
Верный способ разрушить программу...
← →
default © (2004-05-10 10:18) [26]Algol (10.05.04 10:13) [25]
я ж написал что нет никакой уверенности в этом способе, но как говорится "всё работает"
← →
Algol (2004-05-10 10:26) [27]
> default © (10.05.04 10:18) [26]
Потерянный указатель может указывать куда угодно, в том числе и на недавно созданный и ничего не подозреваюищий объект, который вы своим FreeMem и хлопните.
← →
Тимохов © (2004-05-10 10:32) [28]Уважаемые.
Может просто игронировать такие отстойные посты?
Обидно аж за потраченное на такую фигню время уважаемых людей... :((
← →
default © (2004-05-10 10:45) [29]Algol (10.05.04 10:26) [27]
да всё это прекрасно понятно...давайте говорить конкретно
покажите пример кода показывающий несостоятельность этого способа
(сотый раз повторюсь - я ни на грамм не говорю что это хороший рабочий способ просто хочется увидеть где он обломается)
← →
Anatoly Podgoretsky © (2004-05-10 10:45) [30]Тимохов © (10.05.04 10:32) [28]
Да не растраивайся, ведь не по серьезному же тратится, какая уж тут серьезность.
← →
default © (2004-05-10 10:47) [31]Тимохов © (10.05.04 10:32) [28]
извините, конечно, но не люблю когда подмазываются...
"уважаемые люди" сами, наверно, решат учавствовать им в данном сабже или нет
← →
Тимохов © (2004-05-10 10:53) [32]
> default © (10.05.04 10:47) [31]
извините, конечно, но не люблю когда не по делу огрызаются.
Вы не находите, что темы типа "Дельфи - г..но" побуждают бурные эмоции, хотя имхо должны были бы просто не вызывать интереса?
← →
default © (2004-05-10 10:57) [33]Тимохов © (10.05.04 10:53) [32]
это вопросы к модераторам
если они это не удалили значит этот сабж имеет право жить
а было бы инересно если бы все посты были "умнющими"?
некоторое время, наверно, только потом бы всем стало скучно, и не хотелось бы читать посты потому чтобы понять в чём дело и придумать неорд-ое решение надо минимум часа 2 было бы...
← →
Sergey Masloff (2004-05-10 10:58) [34]default © (10.05.04 10:45) [29]
или я чего-то не понял или...
procedure TForm1.Button1Click(Sender: TObject);
var
p : Pointer;
begin
p := Pointer($0000FFFF); // Например
if IsInvalidPointer(p) then
ShowMessage("Инвалид")
else
ShowMessage(TObject(p).ClassName);
end;
← →
default © (2004-05-10 10:59) [35]не посты а сабжы...(то есть вопросы поставленные...)
← →
Тимохов © (2004-05-10 11:01) [36]
> default © (10.05.04 10:57) [33]
Дело не в глупости данного вопроса, а в его провокационности.
Вопросы должно быть по делу. Пусть глупые и глубоко неквалифицированные - поправить человека всегда найдется желающий.
← →
Sergey Masloff (2004-05-10 11:01) [37]ну в смысле ShowMessage(TObject(p).ClassName); -> AccessViolation
← →
default © (2004-05-10 11:05) [38]Sergey Masloff (10.05.04 10:58) [34]
sorry, название не соотв-ет смыслу IsNotInvalidPointer
то что FreeMem распознаёт битые указатели на объекты это ладно, хотелось бы увидеть чтоб после передачи нормального указателя на объект в эту ф-ию объектом пользоваться было бы нельзя
← →
Verg © (2004-05-10 11:25) [39]
> хотелось бы увидеть чтоб после передачи нормального указателя
> на объект в эту ф-ию объектом пользоваться было бы нельзя
procedure TForm1.Button1Click(Sender: TObject);
begin
IsNotInvalidPointer(Form1);
end;
← →
Algol (2004-05-10 11:37) [40]Вот тоже любопытный результат:
type
TMyClass=class
v:Integer;
end;
....
procedure TForm1.Button1Click(Sender: TObject);
var V,V1:TMyClass;
begin
V:=TMyClass.Create;
V.v:=1111111;
if IsNotInvalidPointer(V) then
showMessage(intToStr(V.V));
if IsNotInvalidPointer(V) then
showMessage(intToStr(V.V));
end;
← →
default © (2004-05-10 12:03) [41]казалось бы что проще: указатель на объект указывает на младший байт адреса VMT(нам вообще пофигу на что - главно что указывает на байт памяти выделенный менеджером памяти Delphi во время выполнения) и когда объект разрушен - память освобождена и попытка обращения к ней(допустим к байту описанному выше) через битый указатель приведёт к AV-у и дело с концом...но никакого AV-а нет!, память не освобождается сразу что-ли? или компилятор настолько умён что ожидает создания нескольких экзмемпляров данного типа приложением и не освобождает выделенную память
и когда будет попытка создать новый экз-ар достаточно будет вызвать код конст-ра для инициализации и передать "битый" указатель соискателю, вопрос в том сколько придётся ждать, а память будет "висеть" попусту, делает интервалы ожидания и освобождает память в случае их истечения, вряд-ли... многие бы это заметили...хотя...
← →
Тимохов © (2004-05-10 12:07) [42]
> default © (10.05.04 12:03) [41]
не всегда обращение по битому указателю дает av.
можно создать объект, отдестроить, обратится к полю - все будет ок. Если же обратится к методу - скорее всего будет av.
Обращение к битой (в вашем понимании) памяти не приводит к ошибке, т.к. с точки зрения операционной системы память не фига не битая - она зарезирвирована менеджером памяти дельфи.
Другой вопрос, если вы попытаетесь обратится к незарезирвированной менеджером памяти области, то точно будет av.
Попусту ничего не висит.
← →
default © (2004-05-10 12:18) [43]Тимохов © (10.05.04 12:07) [42]
"она зарезирвирована менеджером памяти дельфи."
значит память не освоб-ся, почему?
понятно что надо копать в мен-ре Delphi, но лень
← →
Тимохов © (2004-05-10 12:25) [44]
> default © (10.05.04 12:18) [43]
Скажу честно - я сам менеджер памяти пытался копать несколько раз, но все терпел неудачу, т.к. на тот момент не обладал знаниями об организации памяти в windows.
Теперь вроде как обладаю (немного).
Могу предположить, что сначала менеджер резервирует память (резервирование), потом по мере необходимости передает зарезервированные куски физической памяти (выделение), по мере потери необходимости в памяти меденжер не спишит переводить выделенную память в резервированную - может еще понадобится.
Наверное, ошибаюсь в чем-то, но имхо так было бы логично.
По крайней мере на предположение, что менеджер дельфи не срязу делает uncommit памяти (т.е. из выделенной памяти делает просто резервированную) при freemem наталкивает тот факт, что после freemem часто можно обращаться к освобожденному куску без av. Если бы дельфи сразу отдавал память системе, то точно был бы av.
Вроде так...
Пойду еще почитаю :)
← →
McSimm © (2004-05-10 12:29) [45]С трудом сдержался...
:о)
От аббревиатуры ?
:))
← →
Тимохов © (2004-05-10 12:32) [46]
> McSimm © (10.05.04 12:29) [45]
а может от двуточий, троеточий и такдалееточий?
:)))
← →
default © (2004-05-10 13:03) [47]"Третий, и последний, механизм управления памятью — динамически распределяемые области памяти,
или кучи (heaps). Они весьма удобны при создании множества не больших блоков данных. Например,
связанными списками и деревьями проще манипулировать, используя именно кучи, а не виртуальную
память (глава 15) или файлы, проецируемые в память (глава 17) Преимущество динамически
распределяемой памяти в том, что она позволяет Вам игнорировать гранулярность выделения памяти
и размер страниц и сосредоточиться непосредственно на своей задаче. А недостаток — выделение и
освобождение блоков памяти проходит медленнее, чем при использовании других механизмов, и,
кроме того, Вы теряете прямой контроль над передачей физической памяти и ее возвратом системе. "
Из Рихтера
скорее всего в этом дело, наверно, ОС не торопиться забираь у процесса опер-ую память, а то вдруг вскоре он опять у неё её попросит а тут хоп на те сразу...
← →
Тимохов © (2004-05-10 13:06) [48]
> default © (10.05.04 13:03) [47]
Если я не ошибаюсь кучи не имеют отношения к дельфовому менеджеру памяти.
Весь ответ в копании ссылки http://rsdn.ru/article/Delphi/memmanager.xml
Дома посмотрю...
← →
default © (2004-05-10 13:27) [49]Тимохов © (10.05.04 13:06) [48]
да, по этому менеджер и основан на ф-их выдел-ия вирт-ой памяти поскольку там сам контр-ешь когда память получаешь когда отдаёшь, в кучах же дейс-ют свои алгоритмы...
но на мой взгляд уже не важно всё это не освоб-ет мен-ер памяти её же сразу и всё тут, а почему уже и не так важно, написав свой
мен-ер памяти мы сможем со 100% вер-ью определять битость ссылки на объект, но мне это не больно интересно, понимаю этот новый алгоритм управления памятью работал бы для всей системы, а то только в Delphi...
← →
Игорь Шевченко © (2004-05-10 13:42) [50]Sergey Masloff (10.05.04 10:58)
LOL
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.045 c