Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.05.2007, 01:53
PZh PZh вне форума
Прохожий
 
Регистрация: 20.04.2007
Сообщения: 7
Репутация: 10
Вопрос Риторический вопрос

У меня следующие вопросы:
Если память выделенную функциями GetMem, New, конструкторами объектов и т.д. не освободить, а просто потерять указатель, то эта память становится недоступной? А после завершения приложения?

И что происходит если возвращаемый функцией тип - указатель, и под него выделена память в теле функции, а она вызывается как процедура?

Что наиболее быстро работает если речь идет о обработке больших 2-х и более мерных массивах? Есть ли резон использовать array of array ...

Если не трудно, кинте ссылки на хороший материал, где глубоко описано ООп и память вообще, как и где что живет и взаимодействует(функции, переменные, типы, классы). Очень интересно.

P.S. Пооместить не знал где.
Ответить с цитированием
  #2  
Старый 18.05.2007, 13:07
AlexZL AlexZL вне форума
Новичок
 
Регистрация: 06.01.2006
Сообщения: 87
Репутация: 20
Лампочка

Если потерять указатель, а потом его вспомнить, то снова можно использовать эту память %) Память останется выделенной на протяжении всей работы приложения. А вот после завершения будет освобождена.

Цитата:
И что происходит если возвращаемый функцией тип - указатель, и под него выделена память в теле функции, а она вызывается как процедура?
Не понял, кто вызывается как процедура? Функция, которая возвращает указатель, или значение указателя интерпретируется как ссылка на процедуру?
Если 1е, то указатель процедура не вернет, память будет выделена, ссылка на нее есстесно потеряется... но память будеть оставаться распределенной в куче до завершения процесса.

Если речь об обработке многомерных массивов, то тут скорость зависит в 1ю очередь от твоего алгоритма обработки массива.
В делфи многомерный массив - это указатель на память, где хранится массив указателей, ссылающихся на другие указатели и т.д. в зависимости от n-мерности, в конце которые указывают на память, где хранятся сами значения. Если массив динамический, то распределяется он точно в куче.
Ответить с цитированием
  #3  
Старый 19.05.2007, 23:29
PZh PZh вне форума
Прохожий
 
Регистрация: 20.04.2007
Сообщения: 7
Репутация: 10
По умолчанию

То есть например:
procedure KillByte;
var
P: Pointer;
begin
GetMem(P, 1);
end;

Убивает байт памяти, который становится недоступен ни данному процессу, ни другому?
А после завершения процесса он будет доступен.
Освобождать память от используемых на всем протяжении работы приложения структур тогда необязатьльно в его финальной части (как это делается во всей литературе). Правильно я понял?
А какие "несознательные" следы тогда может оставлять приложение?
Ответить с цитированием
  #4  
Старый 20.05.2007, 18:29
AlexZL AlexZL вне форума
Новичок
 
Регистрация: 06.01.2006
Сообщения: 87
Репутация: 20
По умолчанию

Цитата:
Убивает байт памяти, который становится недоступен ни данному процессу, ни другому?
Этот байт памяти никак не может быть доступен из другого процесса. Никогда. А из текущего процесса он доступен. Другое дело, что выйдя из процедуры указатель на память будет потерян. Но если как-то случайно записать именно по этому потерянному адресу, то ошибки не будет.
Потерянный указатель - проблема программиста в данном случае.

Да, после завершения процесса память освободится. Если вдаваться в технические подробности, то 1 байт никогда не резервируется, выделяется кусок памяти, когда он заполнится выделяется еще один и т.д.

Цитата:
Освобождать память от используемых на всем протяжении работы приложения структур тогда необязатьльно в его финальной части (как это делается во всей литературе). Правильно я понял?

А кто сказал что память освобождают именно в финальной части? Память освобождают когда хранящиеся в ней данные уже не нужны. Если этого не делать, ваше приложение может сожрать мегабайт 100 или больше оперативы. В зависимости от запущенности случая))
Но даже в конце работы приложения настоятельно советую освобождать память, это хороший тон.

вот кстати интересная ссылочка, на тему менеджера памяти в Делфи:
http://rsdn.ru/article/Delphi/memmanager.xml
Ответить с цитированием
  #5  
Старый 20.05.2007, 18:41
AlexZL AlexZL вне форума
Новичок
 
Регистрация: 06.01.2006
Сообщения: 87
Репутация: 20
По умолчанию

Или вот еще статейка. То, что в ней описано, по-моему, обязан знать каждый программер платформы win32.
http://www.citforum.ru/operating_sys...ntadm_01.shtml

//не совсем в тему, но статья полезная. И про менеджер памяти Виндовса там рассказывается
Ответить с цитированием
  #6  
Старый 23.05.2007, 02:34
PZh PZh вне форума
Прохожий
 
Регистрация: 20.04.2007
Сообщения: 7
Репутация: 10
По умолчанию

Спасибо.
А как уничтожить неглавную форму при ее закрытии, без кода в модуле главной формы?
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter