|
Объясните мне надо ли освобождать память в частности при CopyMemory и как, не догоняю
|
|||
---|---|---|---|
#18+
Пример кода: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
Что неясно. 1. OpalSendMessage_ возвращает указатель BackMesPtr на место A При использовании CopyMemory я создаю копию в место B Если я правильно понимаю, то память в место A и место B остается занята. 2. Абсолютно не ясен смысл чего там удаляет в памяти опаловская OpalFreeMessage Из документации и кодов Opal: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
В VB6 декларирую так: Код: vbnet 1. 2.
В отличии от OpalSendMessage_ Код: vbnet 1. 2.
OpalFreeMessage_... даже не содержит хэндла на процесс dll возвращенный при инициализации(ByVal opal As Long), т.е. не понятно каким боком оно очищает место A (про которое знает Opal) или место B , про кот. Opal не знает(куда я скопировал через CopyMemory). А ссылаюсь я походу вообще на место C ( Dim MesFree As OpalMessageRegistration) Хотя подозреваю что место С = место B (операцией присваивания). Кто нибудь разжует, нужна ли эта OpalFreeMessage? Да и правильно ли я ее применяю в VB6 - сомнения...? и нужно ли что-то еще? Или выкинуть OpalFreeMessage и забить на все (на работу не влияет, хотя память еще забьеся - тоже неприятно). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2012, 22:59 |
|
Объясните мне надо ли освобождать память в частности при CopyMemory и как, не догоняю
|
|||
---|---|---|---|
#18+
Так что не разжует никто? Я обратил внимание, что при вызовах OpalFreeMessage как я это делаю в приведенном коде VB-приложение часто ( случайно!!! ) дает crash. Причем если верить виндам, то Crash обычно связан с попыткой чтения памяти по адресу "0x00...04" C чего бы это, 4 - длина as Long Я вообще не уверен 1) Что я вызываю OpalFreeMessage правильно 2) Что она вообще реально нужна. Я убрал конструкции вида: Код: vbnet 1. 2. 3. 4. 5.
-крашей больше не видно. Память не сдохнет? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2012, 16:55 |
|
Объясните мне надо ли освобождать память в частности при CopyMemory и как, не догоняю
|
|||
---|---|---|---|
#18+
> Автор: Дмитрий77 > Так что не разжует никто? Дима, это нужно вычитывать в документации к твоему Опалу. Нужно ли делать OpalFreeMessage для полученых сообщений, или система их сама внутри освобождает после отдачи тебе функцией GetMessage(). Или спрашивать у разработчика. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2012, 17:37 |
|
Объясните мне надо ли освобождать память в частности при CopyMemory и как, не догоняю
|
|||
---|---|---|---|
#18+
Игорь Горбонос, >Или спрашивать у разработчика. Да, только разработчик VB6 знает сильно хуже чем я C++ не знает вообще >в документации >Нужно ли делать OpalFreeMessage В документации написано что НАДО посылать OpalFreeMessage после каждого OpalGetMessage() or OpalSendMessage(). Судя по документации: Дмитрий77Из документации и кодов Opal: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
OpalFreeMessage тупо освобождает память занимаемую исходным message. free(message); Но при этом message (на логике C++ и как задумано), передаваемый в OpalFreeMessage суть тот же самый message, полученный в OpalGetMessage() or OpalSendMessage(), занимающий ту же область памяти, что и занимал. А я вместо того чтоб очищать исходно занятую память, похоже отправляю команду очистить память занятую КОПИЕЙ (CopyMemory). Причем походу VB6 сам эту копию уничтожает по выходу из Private Sub CommandRegister_Click(). Код: vbnet 1. 2.
М.б. 1) заменить CopyMemory на MoveMemory (<< это сразу сделает то же самое, что ожидается от OpalFreeMessage и освободит память, которую изначально занимает message) 2) Убрать OpalFreeMessage из VB6 кода, т.к. бессмысленно в силу пункта(1) 3) КОПИЯ автоматически уничтожится встроенными средствами VB6 ТАК? Если не так пожалуйста поправьте. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2012, 20:17 |
|
Объясните мне надо ли освобождать память в частности при CopyMemory и как, не догоняю
|
|||
---|---|---|---|
#18+
Дмитрий771) заменить CopyMemory на MoveMemory (<< это сразу сделает то же самое, что ожидается от OpalFreeMessage и освободит память, которую изначально занимает message) Глупость сказал. Это одно и то же RtlMoveMemory Тогда думаю надо просто выкинуть OpalFreeMessage и будет счастие. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2012, 20:46 |
|
Объясните мне надо ли освобождать память в частности при CopyMemory и как, не догоняю
|
|||
---|---|---|---|
#18+
Игорь Горбонос> Автор: Дмитрий77 > Так что не разжует никто? Дима, это нужно вычитывать в документации к твоему Опалу. Нужно ли делать OpalFreeMessage для полученых сообщений, или система их сама внутри освобождает после отдачи тебе функцией GetMessage(). Или спрашивать у разработчика. Ну, разработчик ответил буквально следующее: РазработчикAll I can say is if you do not use OpalFreeMessage() you will probably leak memory. Note OpalFreeMessage is only used for messages provided as return value by OpalGetMessage or OpalSendMessage, it is not for messages you create. Ну т.е. вот так тогда надо???: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
В Opal имеем следующий код по поводу OpalFreeMessage: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Судя по логу Opal когда так делаю,Opal понимает о чем идет речь: Код: plaintext 1.
Смотрим описание функции free Deallocates or frees a memory block. The free function deallocates a memory block (memblock) that was previously allocated by a call to calloc, malloc, or realloc. The number of freed bytes is equivalent to the number of bytes requested when the block was allocated (or reallocated, in the case of realloc). mallloc вроде как используется при подготовке обратного сообщения на которое указывает BackMesPtr: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Т.е. логично ли и правдоподобно следующее? 1) Посылаю OpalSendMessage, получаю назад указатель BackMesPtr 2) По указателю BackMesPtr ковыряю память и обрабатываю Message (моим VB6 приложением) 3) Скармливаю указатель BackMesPtr ф-ции OpalFreeMessage Lib "opal.dll" (ByVal ptr As Long) (т.к. уже его обработал) (Если этого не делаю, теряю память, занимаемую Message) 4) Дальше не мои проблемы и память занимаемая Message освобождается на стороне Opal (т.к. мой указатель известен Opal, ибо был заранее препарирован с помощью malloc и он знает как делать free ). Так что ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2012, 15:10 |
|
|
start [/forum/topic.php?fid=60&tid=2157459]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 158ms |
0 / 0 |