Применение HeapAlloc, HeapFree
От: Orlena Россия  
Дата: 28.11.03 14:29
Оценка:
Вопрос: используется HeapAlloc 1 раз, а переменная вызывается несколько раз, то HeapFree достаточно указать только один раз или...?
Re: Применение HeapAlloc, HeapFree
От: Иль  
Дата: 28.11.03 14:35
Оценка:
Здравствуйте, Orlena, Вы писали:

O>Вопрос: используется HeapAlloc 1 раз, а переменная вызывается несколько раз, то HeapFree достаточно указать только один раз или...?


Безусловно только один. И не забыть это сделать.
А вообще HeapAlloc и HeapFree — низкоуровневые MS-ные аналоги обычных new и delete
Re: Применение HeapAlloc, HeapFree
От: Аноним  
Дата: 28.11.03 14:35
Оценка:
Здравствуйте, Orlena, Вы писали:

O>Вопрос: используется HeapAlloc 1 раз, а переменная вызывается несколько раз, то HeapFree достаточно указать только один раз или...?


На каждый вызов функции HeapAlloc -- соответствующий вызов функции HeapFree
Re: Применение HeapAlloc, HeapFree
От: PM  
Дата: 28.11.03 14:36
Оценка:
Здраствуйте, Orlena. Вы писали:

O> Вопрос: используется HeapAlloc 1 раз, а переменная вызывается несколько

O> раз, то HeapFree достаточно указать только один раз или...?
Что значит переменная вызывается?
Вообще HeapAlloc выделяет память, которую обязательно нужно освободить, вызвав HeapFree, т.е. каждый вызов HeapAlloc должен сопровождаться последующим HeapFree.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[2]: Применение HeapAlloc, HeapFree
От: SergeMukhin Россия  
Дата: 28.11.03 15:08
Оценка:
Здравствуйте, Иль, Вы писали:

Иль>Здравствуйте, Orlena, Вы писали:


O>>Вопрос: используется HeapAlloc 1 раз, а переменная вызывается несколько раз, то HeapFree достаточно указать только один раз или...?


Иль>Безусловно только один. И не забыть это сделать.

Иль>А вообще HeapAlloc и HeapFree — низкоуровневые MS-ные аналоги обычных new и delete

если это С, то там нет new/delete и тогда лучше пользоваться С-шными malloc/free
... << RSDN@Home 1.1.0 stable >>
---
С уважением,
Сергей Мухин
Re[2]: Применение HeapAlloc, HeapFree
От: MaximE Великобритания  
Дата: 28.11.03 17:29
Оценка:
Здравствуйте, Иль, Вы писали:

Иль>А вообще HeapAlloc и HeapFree — низкоуровневые MS-ные аналоги обычных new и delete


Не аналоги. new и delete — ключевые слова языка. HeapAlloc и HeapFree — платформенные ф-ции выделения/освобождения памяти. Не более того.
Re[2]: Применение HeapAlloc, HeapFree
От: WolfHound  
Дата: 28.11.03 18:31
Оценка:
Здравствуйте, Иль, Вы писали:

Иль>А вообще HeapAlloc и HeapFree — низкоуровневые MS-ные аналоги обычных new и delete

Ну тут есть еще такая мелочь как конструкторы и деструкторы new/delete и вызывают, а HeapAlloc/HeapFree нет.
... << RSDN@Home 1.1 beta 2 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Применение HeapAlloc, HeapFree
От: WolfHound  
Дата: 28.11.03 18:31
Оценка:
Здравствуйте, Orlena, Вы писали:

O>Вопрос: используется HeapAlloc 1 раз, а переменная вызывается несколько раз, то HeapFree достаточно указать только один раз или...?

На каждый HeapAlloc должен быть один и только один HeapFree.
А new/delete не проще? А еще проще использовать смартпоинтеры.
... << RSDN@Home 1.1 beta 2 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Ситуация следующая ->
От: Orlena Россия  
Дата: 29.11.03 09:26
Оценка:
Здравствуйте, PM, Вы писали:

PM>Что значит переменная вызывается?

PM>Вообще HeapAlloc выделяет память, которую обязательно нужно освободить, вызвав HeapFree, т.е. каждый вызов HeapAlloc должен сопровождаться последующим HeapFree.
-------------------------------------------------
Ситуация следующая (VC++). Исользуется, например, ф-ция
//---
void DrawImage( void )
{...
clrLineIntensImage = (COLORREF*)HeapAlloc( hCurProcess, HEAP_ZERO_MEMORY, sizeof(COLORREF)*iImageImgWidth + 5 );
...
}

в которой, как видно, есть HeapAlloc. Далее в программе вызывается
//---
DrawImage (); //1
...
clrLineIntensImage [] = ...;
...
DrawImage (); //2
,,,
HeapFree ( GetProcessHeap(), 0, clrLineIntensImage );

вызываю ф-цию DrawImage (); — два раза, то и Heap тоже два? Или Heap можно только в конце указать?
Re[3]: Ситуация следующая ->
От: Аноним  
Дата: 01.12.03 12:13
Оценка:
Здравствуйте, Orlena, Вы писали:
[]
O>//---
O>DrawImage (); //1
O>...
O>clrLineIntensImage [] = ...;
O>...
O>DrawImage (); //2
O>,,,
O>HeapFree ( GetProcessHeap(), 0, clrLineIntensImage );

O>вызываю ф-цию DrawImage (); — два раза, то и Heap тоже два? Или Heap можно только в конце указать?

А функция DrawImage каждый раз вызывает HeapAlloc, или же при втором вызове она будет использовать память, оставшуюся от первого вызова? Если HeapAlloc вызывается каждый раз, то перед строкой "//2"
нужен еще один HeapFree(...).
Re[4]: Ситуация следующая ->
От: Orlena Россия  
Дата: 01.12.03 13:13
Оценка:
Здравствуйте, Аноним, Вы писали:
=====================
А>А функция DrawImage каждый раз вызывает HeapAlloc, или же при втором вызове она будет использовать память, оставшуюся от первого вызова? Если HeapAlloc вызывается каждый раз, то перед строкой "//2"
А>нужен еще один HeapFree(...).
=====================
Понятно, значит в моей ситуации надо будет каждый раз указывать HeapFree... Интересно. Я сейчас погрузилась в описание построения виртуальной памяти. Скорее всего (поскольку у меня вин98) надо будет заменит ф-ции HeapAlloc, HeapFree на соответственно VirtualAlloc, VirtualFree... Чтож, будем надеяться что решение где-то рядом
Re[5]: Ситуация следующая ->
От: SergeMukhin Россия  
Дата: 01.12.03 13:55
Оценка:
Здравствуйте, Orlena, Вы писали:

O>Здравствуйте, Аноним, Вы писали:

O>=====================
А>>А функция DrawImage каждый раз вызывает HeapAlloc, или же при втором вызове она будет использовать память, оставшуюся от первого вызова? Если HeapAlloc вызывается каждый раз, то перед строкой "//2"
А>>нужен еще один HeapFree(...).
O>=====================
O>Понятно, значит в моей ситуации надо будет каждый раз указывать HeapFree... Интересно. Я сейчас погрузилась в описание построения виртуальной памяти. Скорее всего (поскольку у меня вин98) надо будет заменит ф-ции HeapAlloc, HeapFree на соответственно VirtualAlloc, VirtualFree... Чтож, будем надеяться что решение где-то рядом

зачем VirtualAlloc ? это очень низкий уровень. Лучше malloc/free
... << RSDN@Home 1.1.0 stable >>
---
С уважением,
Сергей Мухин
Re[5]: Ситуация следующая ->
От: Alexey Chen Чили  
Дата: 01.12.03 14:09
Оценка:
Здравствуйте, Orlena, Вы писали:

O>Здравствуйте, Аноним, Вы писали:

O>=====================
А>>А функция DrawImage каждый раз вызывает HeapAlloc, или же при втором вызове она будет использовать память, оставшуюся от первого вызова? Если HeapAlloc вызывается каждый раз, то перед строкой "//2"
А>>нужен еще один HeapFree(...).
O>=====================
O>Понятно, значит в моей ситуации надо будет каждый раз указывать HeapFree... Интересно. Я сейчас погрузилась в описание построения виртуальной памяти. Скорее всего (поскольку у меня вин98) надо будет заменит ф-ции HeapAlloc, HeapFree на соответственно VirtualAlloc, VirtualFree... Чтож, будем надеяться что решение где-то рядом

Эээ, а может всетаки malloc/free?
Не надо погружаться в описание VMM'а, зачем оно тебе? Считай что у тебя только две функции malloc и free.

типа твоего кода ....

ARRAY_ELEMNT_TYPE* g_array = 0;
long g_count = 0;

... prepare_array()
{
  long count = 0;
  // ...  определяем сколько элементов нужно
  if ( g_array ) free(g_array);
  g_array = malloc(sizeof(ARRAY_ELEMNT_TYPE)*count);
  g_count = count;
  // .... заполняем
}


//далее по коду .... 

prepare_array();

// ... using

prepare_array();

// ... using

//и при завершении программы

if ( g_array ) free (g_array);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.