[Форум] [Помощь] [Поиск] [Выйти] |
Добро пожаловать, User |
|
|
| ||
Имеется Делфи версии 7. Имеется нетипизированный указатель типа Pointer. Смысл такой: в процессе работы по адресу этому может храниться все что угодно, всякая разная кака, абсолютно произвольного типа, от байта до массива и объектов. При присваивании нового значения освобождается память от старого и выделяется для нового. New и Dispose отбрасываются сразу, т.к. служат для типизированных указателей, Смущает процедура FreeMem, в которой второй параметр необязателен, будет ли она корректно работать если не указывать размер освобождаемой памяти? Меня смущает вот что. Допустим есть некоторая переменная P:Pointer, мы под нее выделили 4 байта и записали туда число допустим 10. После этого SizeOf(P^) выдает 0, к чему бы это? |
| ||
> SizeOf(P^) выдает 0 0? код ошибки поди :-) такие штуки на входе обычно желают иметь тип, а не адрес, по которому лежит число допустим 10. |
| ||
> SizeOf(P^) выдает 0 Интересно что такая штука вообще компилируется (но она компилируется) - не может быть определен размер того на что указывает нетип. указатель. О том что в FreeMem не требует обязательно указывать размер... Это особенности менеджера памяти - в его внутренностях хранится размер каждого выделенного блока. Даже если достать подробное описание работы менеджера, пользоваться этим скорее всего нельзя, так как в противном случае все было бы описано в документации Borland. Да, кстати, хороший тон все таки указывать в FreeMem размер. Выход - пищи свой собственный менеджер памяти (это не так уж трудно). Если не писать собственный менеджер, то стоит забыть об одинаковом (едином) способе освобождении памяти по которой хранятся как значения типа байт и т.п., так и массивы и объекты. Можно хранить всегда объекты, а уже в них хоть что. Тогда все будет освобождаться TObject(P).Free (об этом ты и сам наверное знаешь) А может быть поможет информация типах периода выполнения (RTTI)? |
| ||
среди меня это "пользоваться этим скорее всего нельзя" и это "Да, кстати, хороший тон все таки указывать в FreeMem размер" и это "то стоит забыть об одинаковом" вызывает противоречие. думаю, что паскалевские GetMem/FreeMem аналоги сишных malloc/free. т.е. 1) пользоваться очень даже можно, 2) размер указывать не надо (и не нарвёшься на exception и хранить не придётся), 3) способ одинаковый взять-GetMem, отдать-FreeMem пример: cat > b.c << EOF #include <malloc.h> #include <stdio.h> main(){ void *p; // переменная типа указатель (P:Pointer) int *i; // переменная типа указатель на int char *c; // переменная типа указатель на char printf("pa:%p ", p); // формат %p печатает адрес как адрес if( p = malloc(4 * sizeof(char)) ){ // под нее выделили 4 байта printf("pa:%p ", p); * (int *)p = 65; // и записали туда число допустим 65 // печатаем то, что хранится по адресу лежащему в Р, как int printf("pv:%d ", * (int *)p); i = p; // или так printf("pa:%p ", i); printf("pv:%d ", *i); // печатаем то, что хранится по адресу лежащему в Р, как char printf("pv:%c ", * (char *)p); c = p; // или так printf("pa:%p ", c); printf("pv:%c ", *c); free(p); // освобождаем память } } EOF gcc b.c ./a.out pa:0x80484a0 pa:0x86b2008 pv:65 pa:0x86b2008 pv:65 pv:A pa:0x86b2008 pv:A |
| ||
САНЬКЕ: всё-таки указатели и работа с ними в Делфи и С++ сделаны по-разному, так что еть вероятность, что Вы не правы) И люди... неужели нельзя писать без этих извратов?.. Ведь для Вас ООП придумали.. ведь там всё ясно, понятно, удобно... Ведь даже мэтры, такие как Страуструп, описывая работу с указателями, просят вас не извращаться с памятью... доверьте Вы уже работу с памятью средствам операционной системы, зря что ли для Вас столько людей работает?.. |
| ||
{доверьте Вы уже работу с памятью средствам операционной системы, зря что ли для Вас столько людей работает?} Это верно, взять, к примеру, Java: нет указателей - нет проблем ;) Хотя, странный факт: Delphi отчего-то очень популярен в Костроме. Пытался, но не смог понять причин... Вроде и рабочих мест со знанием Дельфи не так много... |
| ||
для Sleep-Walker: вероятность, что под указателями понимаются разные сущности конечно есть. Борланд всёж, фирменная реализация, и всё такое ;-) а какая связь между ООП и средствами ОС€ для Patrol: вопрос: а что, горбатый коллектор это разве средство ОС€ ;) / доверьте Вы уже работу с памятью средствам операционной системы //Это верно, взять, к примеру, Java по слухам, проблемы есть даже в шарпе ;-))) |
| ||
Я вот тут сделал умную вещь - почитал мануалку к борландовским функциям. У этих извращенцев оказывается есть еще пара функций для работы с динамической памятью. Initialization и Finalization, аргументы которых нетипизированы. По задумке авторов (в моем корявом переводе) они служат для освобождения памяти от структур, на которые указывает указатель (в принципе он на то и указатель) типа массивов, строк, объектов и твт. Если я все правильно перепутал, то это получаются функции для ленивых? :) И еще, насчет FreeMem. После манипуляций по хранению переменных в куче (ака динамическая память), выяснилось, что после вызова FreeMem без указания размера освобождаемого участка, при выделении памяти под новую переменную, участок размещается по тому же адресу. Скорее всего, это обозначает, что функция корректно работает без указания умолчального параметра. |
| ||
To САНЬКЕ: <<среди меня это "пользоваться этим скорее всего нельзя" и это "Да, кстати, хороший тон все таки указывать в FreeMem размер" и это "то стоит забыть об одинаковом" вызывает противоречие.>> Пусть освобождать память после отдельных переменных, типа байт и т.п. можно и без указания размера (хотя такого я, например, никогда не допускаю). Но речь то идет об "едином способе" освобожнения памяти. Для динамических массивов и объектов FreeMem вообще не прокатит. |
| ||
to Patrol: <<Это верно, взять, к примеру, Java: нет указателей - нет проблем ;)>> Нет компов - нет программ, нет программирования, т.е. иметь или не иметь. Такие средства как указатели, прямое преобразование типа, передача подпрограмм в качестве параметров и их вызов (и. т.п.) лучше иметь. Все таки задачи быват разные и в некоторых из них без этого не обойтись. <<Хотя, странный факт: Delphi отчего-то очень популярен в Костроме. Пытался, но не смог понять причин... Вроде и рабочих мест со знанием Дельфи не так много... >> Что-то это мне напоминает из этого форума... to CAHbKA: <<а какая связь между ООП и средствами ОС€ >> В основном согласен, что связь сомнительна, однако есть. Это COM. Правда заменить ею "обычые" классы невозможно по множеству причин. Но факт, что COM - Это воплощение принципов ОПП на уровне ОС. ti Gott: << после вызова FreeMem без указания размера освобождаемого участка, при выделении памяти под новую переменную, участок размещается по тому же адресу. Скорее всего, это обозначает, что функция корректно работает без указания умолчального параметра. >> Это говорит лишь о том, что менеджер памяти Делфи специально приспособлен для манипуляции большим количеством небольших фрагментов динамической памяти. И то что место под новую переменную выделяется там же где была старая - это всего лишь оптимизация (которую выполняет менеджер памяти) |
| ||
для KiaProg Пусть освобождать память после отдельных переменных, типа байт и т.п. можно и без указания размера (хотя такого я, например, никогда не допускаю). Но речь то идет об "едином способе" освобожнения памяти. Для динамических массивов и объектов FreeMem вообще не прокатит это он и есть, единый способ - 1) взять кусок памяти 2) отдать кусок памяти - GetMem/FreeMem. или другими словами - всё что берем GetMem отдаём только FreeMem и другого способа нет. как трактовать содержимое куска памяти, ну массив там лежит или объект или еще что, дело десятое. что до параметра, то он _необязательный_. не знаю и знать не хочу, что делает с ним Борланд, а вот простой поиск в гугле показывает, что в дургих реализациях (GNU в частности), если параметр указан, то он просто _игнорируется_. |
| ||
для KiaProg Но факт, что COM - Это воплощение принципов ОПП на уровне ОС. это пристяжная технология. наличие winapi не говорит о том, что это ОС. а уж если не подразумевать микрософт говоря о COM, то заведомо пристяжная. а вот загрузчик, динамический, это часть ОС. |
| ||
{горбатый коллектор это разве средство ОС€} Нет, но он эти средства активно использует :) {по слухам, проблемы есть даже в шарпе} "Если ты проснулся, и у тебя нет проблем - значит ты умер" :) |
| ||
To CAHbKA: <<как трактовать содержимое куска памяти, ну массив там лежит или объект или еще что, дело десятое. >> Так это мы о разных вещах говорим. Я как раз имел в виду, что то_что_там_лежит дело не десятое. << это пристяжная технология. наличие winapi не говорит о том, что это ОС. а уж если не подразумевать микрософт говоря о COM, то заведомо пристяжная. а вот загрузчик, динамический, это часть ОС. >> Что значит "пристяжная" (от слова пристегиваться)? Согласен, что инфраструктура, обеспечивающая COM-технологию также реализована в виде нескольких Dll (то есть также как весь API-Windows). Но рассматривать API как не часть ОС, наверное не корректно. Если его убрать, то что это получится за ОС и какие программы под нее могут быть созданы? Многие элементы ОС Windows начиная с Win95OSR, NT4 реализованы с использованием COM. Например оболочки, сообщения API или MAPI, OLE DB, расширения DirectX, Internet ActiveX. Другое дело что можно делать программы без понятия о COM, но это другое дело... Мы же говорили об ОПП в ОС. Так вот, получается ОПП -> CОM, а COM - часть ОС. |
| ||
о каких разных? вот разыменование указателя: SizeOf(P^) тут только и надо, что сказать как хотим интерпретировать данные (какого они типа). в С это можно записать так * (int *)p, т.е. говорим, что "р" не просто указатель, а указатель на int и разыменовываем. тоже будет и в паскале, синтаксис сути не меняет. а можем сказать, что там данные нашего самодельного типа лежат, т.е. дело десятое. пристяжная - тут внешняя по отношению к ОС. апи - это я неточно выразился, не вообще winapi, а COM winapi. ОС останется прежней. программы под неё могут быть созданы в частности такие, цитирую "MAPI, OLE DB, расширения DirectX, Internet ActiveX", может быть создан COM, DCOM и COM+ и даже COM+++ да, мы как раз и говорили, что ООП в ОС нету ;-) да собственно и ООП не панацея, и задач, которые прямо ложатся на ООП мало. очень. а говорили мы про ООП потому, что мысль была нечетко выражена "ООП придумали ... доверьте работу с памятью ОС". т.е случайно ;-) могли и помолчать ;-) |
| ||
В Делфи во многих случаях приведение типа не работает :) Приходится делать то что хотелось бы раком через люстру. А менеджер памяти в самом деле реализован хорошо. После записи по адресу некоторой структуры и передачи затем указателя FreeMem, все прошло нормально, следующий участок был выделен по тому же адресу. А тема, как и пологается, перешла в раздел споров об абстракциях, совершенно не относящихся к топику :) |
| ||
ну, обычное дело. но после того, как ответ был дан. мне так показалось. |
| ||
Интересно вас почитывать, ей богу. Утончённое толкание в ступе :) Не обижайтесь. 2Patrol: По-моему, всё очень даже понятно. Дельфя (царство ей небесное) это последний выдох, с позволения сказать, языка программирования Pascal. Да ты и сам знаешь. А теперь наводящий вопрос: если чему-то, отдалённо напоминающему программирование, в Костроме учат, то с применением какого языка? Вот так и получается, как всегда в россии, выходит стУдент из вуза, не умея говорить на нормальных языках, и, чаще всего, до кучи, не пробовавший кодировать реальные задачи. На моей предпоследней работе только выпустившийся из UoT студент за полгода написал весь бэк-офис, который ещё не был куплен. Под чутким руководством, конечно, но всё равно, всё сам. Михаил. |
| ||
Я не знаю, чему учат... Нас учили Паскалю и Бейсику, после моего выпуска, вроде, VB читали... Я тоже раньше на Дельфи писал, но потом перелез сразу :) |
| ||
Миша, ты сейчас тоже что-ли в кэнэде? Наши студенты тоже пишут, не волнуйся. Преподавать в университете надо подходы, а не язык, это я точно уверен. Студент, понимающий OOP, MVC, паттерны, UML, RUP будет писать на любом языке, это уж точно. Тем паче сейчас всё дальше движемся к генераторам кода, а тот-же .net значение языка нивелирует до минимума. |
| ||
не Миш, всё практически было сказано к месту ;-) хотя конечно высота прожитых будней у фрюховодов выше чем у уидоузистов, ну т.е. может тебе и видней ;-) Вот так и получается, как всегда в россии, выходит стУдент из вуза, не умея говорить на нормальных языках, и, чаще всего, до кучи, не пробовавший кодировать реальные задачи. здрасти ;) "кодить" это уровень ПТУ в России, где-то примерно. про университет Винг весьма адекватно высказался. был и я там, на паре лаб, соответствует и понравилось. На моей предпоследней работе только выпустившийся из UoT студент это надо понимать так, что упадок в умах нынче в канаде, а не в России? дескать нашелся только один ботаник, который променял бейсбол, наркотики и пати на учёбу? ;-) |
| ||
Я ж говорю, весело. Я не знаю, как сейчас в России, может ПТУшники научены кодить бек-энды и эн-тиры, а из вузов только сениоров и аналитиков выпускают. Не знаю, спорить не буду. Может тогда и Дельфями не нынешние пользуются, а всё больше те, про которых я помню что помню? :) Да и вообще, её богу, кто сказал что Паскаль это язык программирования? он больше чем абстракная вещь для созерцания, не тянет. :) И зря Саш ты про "россию" обиделся. Я вот не обижаюсь, что ты путаешь Канаду и Штаты :) |
| ||
Я ж говорю, весело. не без этого :-) |
| ||
а я вот думаю, что самый прикольный язык программирования - это нлп ;) и ооп там тоже рулит... |
| ||
Вот хоть убейте, чесслово, никогда не соглашусьс тем, что объектный паскаль хуже сиплюсплюса, никогда и ни за что. Просто то что на паскале напишется в 100 строчек на сиплюсплюсе уберется в 20 вот и все и хватит людЯм мОзги парить - хуже, лучше :))) |
| ||
> Вот хоть убейте, чесслово, никогда не соглашусьс тем, что > объектный паскаль хуже сиплюсплюса, никогда и ни за что. > > Просто то что на паскале напишется в 100 строчек на > сиплюсплюсе уберется в 20 вот и все и хватит людЯм мОзги > парить - хуже, лучше :))) Выпей йаду. |
| ||
Уже пил, не берет. |