Утечка памяти функцией VirtualAlloc

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
gracilic
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.01.2008 (Вс) 12:00

Утечка памяти функцией VirtualAlloc

Сообщение gracilic » 20.01.2008 (Вс) 12:15

Использование функции VirtualAlloc для выделения памяти забивает память, даже если её освобождать функцией VirtualFree и ведёт в конечном итоге к переполнению overflow! Это наглядно показано в приведённом примере. Скажу сразу: результат выполнения VirtualFree не нулевой, более того, даже если убрать строку с VirtualFree, результат не меняется! Что следует сделать, чтобы освобождать память полностью перед её следующим выделением?
Код: Выделить всё

Private Declare Function VirtualAlloc Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFree Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long

Private Const MEM_COMMIT As Long = &H1000
Private Const PAGE_READWRITE As Long = &H4
Private Const MEM_DECOMMIT As Long = &H4000

Private Sub Command1_Click()
Dim mPtr As Long
List1.Clear
For i = 0 To 9
    mPtr = VirtualAlloc(0, 4096, MEM_COMMIT, PAGE_READWRITE)  'Выделяем память
    VirtualFree mPtr, 0, MEM_DECOMMIT 'Освобождаем память
    List1.AddItem mPtr 'Добавляем результат
Next i
End Sub

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 20.01.2008 (Вс) 15:32

Эм. Разве вторым параметром в VirtualFree не должно быть кол-во страниц для освобождения (в данном случае 4096)?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

gracilic
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.01.2008 (Вс) 12:00

Сообщение gracilic » 20.01.2008 (Вс) 15:37

BV писал(а):Эм. Разве вторым параметром в VirtualFree не должно быть кол-во страниц для освобождения (в данном случае 4096)?


Даже если их указать, то ничего не изменится!

P/S/: В условии я уже указал, что VirtualFree возвращает не нуль, то есть работает.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.01.2008 (Вс) 15:49

gracilic
1) Что означает термин "переполнение overflow" по отношению к памяти, и вообще, означает ли что-нибудь?
2) На основании чего ты решил, что память не освобождается?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

gracilic
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.01.2008 (Вс) 12:00

Сообщение gracilic » 20.01.2008 (Вс) 16:14

Хакер писал(а):gracilic
1) Что означает термин "переполнение overflow" по отношению к памяти, и вообще, означает ли что-нибудь?
2) На основании чего ты решил, что память не освобождается?


Если выполнить приведённый программный код, то всё будет ясно: циклическое чередование функций VirtualAlloc и VirtualFree приводит к переполнению памяти, в итоге появляется ошибка 6 - overflow. Контрол List1 наглядно показывает увеличение выделенной памяти. Или я не прав в терминологии? Что же тогда увеличивается и приводит к ошибке? И как этого избежать?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.01.2008 (Вс) 16:24

Если выполнить приведённый программный код, то всё будет ясно: циклическое чередование функций VirtualAlloc и VirtualFree приводит к переполнению памяти, в итоге появляется ошибка 6 - overflow.

Ошибка 6-Overflow не имеет ничего общего с переполнением памяти. C ним связана ошибка 7-Out of memory

А что показывает ListBox? Неодинаковые адреса? А почему ты решил, что он обязательно должен показывать одинаковые?

У меня, например, никаких ошибок не возникает. Ну а память, да, действительно не освобождается. Потому что ты её только лишь декоммитишь, но не освобождаешь.

А в чём необходимость использования именно Virtual-функций?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

gracilic
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.01.2008 (Вс) 12:00

Сообщение gracilic » 20.01.2008 (Вс) 16:57

Хакер писал(а):Ошибка 6-Overflow не имеет ничего общего с переполнением памяти. C ним связана ошибка 7-Out of memory
...
А в чём необходимость использования именно Virtual-функций?

Из сказанного тобой я понял, что mPtr - это всего адрес, хотя я считал это массивом информации. Наверное, overflow появлется, когда этот адрес превышает значение для переменной типа long, то есть 2 в 31 степени?
Но как сделать, чтобы адрес оставался прежним. Кроме того,
если при помощи функции GetProcessMemoryInfo проследить занимаемую процессом выполняемого приложения память, то оказывается, что она тоже увеличивается пропорционально mPtr!!!
Именно это я и считаю проявлением "утечки памяти". Или я не прав?
А какие альтернативы Virtual-функциям?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.01.2008 (Вс) 20:40

Из сказанного тобой я понял, что mPtr - это всего адрес, хотя я считал это массивом информации. Наверное, overflow появлется,

О ужас.

Наверное, overflow появлется, когда этот адрес превышает значение для переменной типа long, то есть 2 в 31 степени?

Он не может превышать его на x86 платформах.

Но как сделать, чтобы адрес оставался прежним. Кроме того,
если при помощи функции GetProcessMemoryInfo проследить занимаемую процессом выполняемого приложения память, то оказывается, что она тоже увеличивается пропорционально mPtr!!!
Именно это я и считаю проявлением "утечки памяти". Или я не прав?

Ты совсем не так, как следует, работаешь с Virtual-функциями.
А какие альтернативы Virtual-функциям?

О, их много. Но я тебе рекомендую обратить свой взор в сторону кучи и, соответственно, - Heap-функций.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.01.2008 (Вс) 21:45

Н-да...
Напиши
VirtualFree(mPtr, 0, &H8000&)
И у тебя будут постоянные адреса.
:roll:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.01.2008 (Вс) 21:46

ANDLL
Я же уже упомянул это.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.01.2008 (Вс) 21:48

А почему ты решил, что он обязательно должен показывать одинаковые?
Ну вообщето потому, что адреса гененрируются вовсе не генератором случайных чисел
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.01.2008 (Вс) 21:52

Я же уже упомянул это.
Причем автор не заметил это, потому что упоминание было сделано наудивление неудачно
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.01.2008 (Вс) 21:54

Кажется, трех сообщений подряд форум не выдержал.
Может все таки соберем пожертвования на нормальный компьютер для форума?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.01.2008 (Вс) 21:56

ANDLL
Чем это он не выдержал?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

gracilic
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.01.2008 (Вс) 12:00

Сообщение gracilic » 20.01.2008 (Вс) 21:58

ANDLL писал(а):
Я же уже упомянул это.
Причем автор не заметил это, потому что упоминание было сделано наудивление неудачно

AnDLL, спасибо за попытки помочь, я давно это заметил, ещё до написания вопроса, но строка VirtualFree mPtr, 0, MEM_RELEASE, если ты это имел ввиду, также не работает, адрес всё равно увеличивается. Поэтому я и не обратил внимания на пустой совет Хакера.

gracilic
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.01.2008 (Вс) 12:00

Сообщение gracilic » 20.01.2008 (Вс) 22:04

Хакер писал(а):Ты совсем не так, как следует, работаешь с Virtual-функциями...

Любое "не так" надо доказывать :wink: .
А память пожирается - и это факт! Я так понимаю, что это особенность Virtual, и действительно надо просто отказаться от работы с ней. :!:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.01.2008 (Вс) 22:07

gracilic
Ты действительно настолько наивен, что считаешь, что ты первый обнаружил, что в Windows неправильно работают Virtual-функции?

И, если человек пытается завести машину, поворачивая руль, как доказать ему, что он делает это не так, как следует. Да и стоит ли?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

gracilic
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.01.2008 (Вс) 12:00

Сообщение gracilic » 20.01.2008 (Вс) 22:17

Хакер писал(а):gracilic
Ты действительно настолько наивен, что считаешь, что ты первый обнаружил, что в Windows неправильно работают Virtual-функции?


Я этого не говорил...

Хакер писал(а):gracilic
И, если человек пытается завести машину, поворачивая руль, как доказать ему, что он делает это не так, как следует. Да и стоит ли?


А умён ли тот, кто, глядя на это, лишь посмеивается и вопрошает у посторонних, как доказать? И что, тяжело было сразу сказать, что с Virtual лучше не связываться? Но всё равно, спасибо за отклик!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.01.2008 (Вс) 22:19

gracilic
А с чего ты взял, что тот, кто глядит на это, вообще посмеивается?
И сказать, что с "Virtual лучше не связываться" действительно было тяжело, потому что это несправедливое высказывание.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 99

    TopList