Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.223.123] |
|
Сообщ.
#1
,
|
|
|
Если мы добавляем элемент в список, то проверяем сколько есть в Heap if memavail<SizeOf(нужный элемент) then exit;
Как такое можно реализовать в Delphi? |
Сообщ.
#2
,
|
|
|
Это реальная проблема с которой вы столкнулись или переделывается 16 битная программа с TP/Delphi1 или Вы только пересели на Дельфи из какой-то 16ти битной среды программирования?
|
Сообщ.
#3
,
|
|||
|
Ну, ты загнул, конечно это реальная проблема! Вообще-то я не то написал MaxAvail надо было! Вот это все как? Мне вообщем функция, которая говорит сколько место в heap:
|
Сообщ.
#4
,
|
|||||
|
MaxAvail пишиться очень просто. Вот так:
|
Сообщ.
#5
,
|
|||
|
Во первых, при компиляции такого ты получишь Overflow in conversion or arithmetic operation. Во вторых, могут столько и не дать, если места на диске мало . А если серьезно, то с точностью до байта, как в старом недобром DOS'е давал MaxAvail, под виндами получить невозможно - система многозадачная, в ней все постоянно живет, меняется. Т.е. если даже предположить наличие такой функции, то между моментом ее вызова и моментом вызова функции запроса памяти, другой нехороший процесс может сожрать всю обещаную Вам память. Под виндами, как и в других многозадачных системах, обычно используется другая стратегия: Вы просто запрашиваете необходимый Вам объем памяти, а потом смотрите дали Вам ее или нет. |
Сообщ.
#6
,
|
|
|
ОК, понятно!
|
Сообщ.
#7
,
|
|||||||
|
Такого никогда не дадут В Win32 под приложение отводится 2ГБ(если хорошо попросить, то 3ГБ), реально немного меньше.
А как же GetHeapStatus?
У каждого процесса своя виртуальная память, так что про другие процессы с определенными ограничениями можно забыть.
|
Сообщ.
#8
,
|
|||||||
|
Сначала хотел ответить так-же, но решил сначала сам проверить. Так вот, 3 с лишним Гб дали легко!.
Дак как я и сказал - скажут что есть, а потом могут недать.
Так-то оно так. Но, во первых, в рамках своего процесса порой работают и потоки и модули о которых мало что известно (COM-объекты, Dll, и т.п.), а они тоже памяти хотят, причем именно памяти твоего процесса. А во вторых, да, другие процессы имеют свою виртуальную память. Но надо понимать что ВСЯ виртуальная память отображается на единственную физическую память и HDD. Поэтому, все процессы черпают ее из одной кастрюльки, увы не бесконечной . |
Сообщ.
#9
,
|
|||
|
А какая винда? Есть предположение что этакие штуки только в 2000/XP проходят, а в более древних виндах всё те же 2Gb... |
Сообщ.
#10
,
|
|||
|
Приведи код вызова и как ты определял. |
Сообщ.
#11
,
|
|||
|
Если верить Джеффри Рихтеру, а не верить ему нет оснований, такое должно быть только в линейке WinNT для 64-разрядных процессоров(IA-64,Alpha). Там приложению отведено 4 ТБ.
Так что если это 32-разрядная версия Windows, то любопытно посмотреть на код. |
Сообщ.
#12
,
|
|||||||||||
|
Господа. Приношу свои извинения за ошибочные сведения которые я привел в своем сообщении №8 - Сильно не бейте . Теперь подробнее. Когда я писал о выполненной мной проверке, я имел в виду следующий код:
Замечу, что код выполняется без Exception, из чего я и сделал предположение что мне дали запрошенные 3Гб. Иначе, было-бы Exception, в соответствии с описанием на Delphi 6:
Вот отсюда и неверность моего ответа (причем я сам был удивлен). Теперь, я решил более подробно исследовать вопрос. Вот код который я написал:
После его запуска я получил результат еще больше удививший меня :
Особое удивление вызывает 4-я строка (2*Gb-10b). Хотя строки 1 и 2 тоже вызывают привычное ощущение - опять обманули (см. цитату из справки). Вот и все, выводы можете делать сами. Да, забыл уточнить. Ипытание проводиолсь в среде Delphi 6 под Windows XP. И еще, если кто захочет попробовать, Log - это моя функция, аналогом может быть что-то вроде:
|
Сообщ.
#13
,
|
|
|
Тут возникает такой вопрос, если я динамически создаю список, например, диспечер показывает, что размер виртуальной памяти для приложения был 2024, запускаю создание списка и вижу, что размер доходит до 30000 потом снижается до 19000, т.е. почему за моим приложением осталось лишнее место, если я его не использую , при повторном создании 19000 увеличивается, т.е. это значит утечка есть
Как ее выявить и избежать? |
Сообщ.
#14
,
|
|
|
Может утечка, а может и особенности распределителя памяти Delphi.
По поводу обнаружения утечек. Есть модуль MemCheck позволяющий обнаруживать утечки. См. здесь |
Сообщ.
#15
,
|
|||||||||
|
Все в порядке, размер получается как до, так и после тем же! Просто отлично, но может я чего не понял, как этот юнит работает, просто он вылетает на строчке
в функции
после
И на всех таких с функцией IntToStr(), и говорит, что все равно есть утечка, хоть диспечер и показывает, что вроде все нормально!
|
Сообщ.
#16
,
|
|||||||||||
|
У меня (Delphi 6) MemCheck прекрасно работает. Для правильного использования этого модуля необходимо сделать следующее: 1. Вставить ссылку на модуль MemCkeck в список используемых модулей в файле проекта (.dpr); 2. Вставить вызов процедуры MemChk после begin в файле проекта (.dpr); 3. Выполнить следующие настройки в Project Options: Compiler/Optimization - выключить Compiler/Stack frames - включить Compiler/Debugging - включить все в этой группе (Use Debug DCUs не обязательно, но желательно) Linker/Include TD32 debug info - включить Packages/Runtime packages/Build with runtime packages - выключить Например, сделал следующий проект:
Соответственно на Form1 пара кнопок со следующими обработчиками:
Теперь запускаю. Если не нажимать никаких кнопок, то после завершения программы появляется файл Project1_MemCheck.log содержащий:
Если-же нажать сначала Button1 а затем Button2, то после завершения файл Project1_MemCheck.log содержит:
Вот так. |