Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Жесткая утечка памяти... АПИ_шники спасайте...!!!!!!!!!! 
:(
    Опции темы
Coocky
Дата 16.4.2005, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Понеслось.Скоро буду возвращать прогу!Заказчик зол.
У меня на экран выводится картинка ,читаемая из файла.
После 2 х часов работы,по словам заказчика картинка не грузится(не отображается)
Ну я начил тестит.Сделал прогу.Задал таймер и начал выводит.Оказалось картинка весом 332Кб пропадает после 142 загрузки.Весом 93Кб после 543 раза.Что делать?
Вот код
Код

HBITMAP LoadAnImage(char* FileName)
   {
   // Use IPicture stuff to use JPG / GIF files
   IPicture* p;
   IStream* s;
   IPersistStream* ps;
   HGLOBAL hG;
   void* pp;
   FILE* fp;


   // Read file in memory
   fp = fopen(FileName,"rb");
   if (!fp)
   return NULL;

   fseek(fp,0,SEEK_END);
   int fs = ftell(fp);
   fseek(fp,0,SEEK_SET);
   hG = GlobalAlloc(GPTR,fs);
   if (!hG)
      {
      fclose(fp);
      return NULL;
      }
   pp = (void*)hG;
   fread(pp,1,fs,fp);
   fclose(fp);

   // Create an IStream so IPicture can
   // CreateStreamOnHGlobal(hG,false,&s);
   if (!s)
      {
      GlobalFree(hG);
      return NULL;
      }

   OleLoadPicture(s,0,false,IID_IPicture,(void**)&p);

   if (!p)
      {
      s->Release();
      GlobalFree(hG);
      return NULL;
      }
   s->Release();
   GlobalFree(hG);

   HBITMAP hB = 0;
   p->get_Handle((unsigned int*)&hB);

   // Copy the image. Necessary, because upon p's release,
   // the handle is destroyed.
   HBITMAP hBB = (HBITMAP)CopyImage(hB,IMAGE_BITMAP,0,0,
                                    LR_COPYRETURNORG);

   p->Release();
   return hBB;
   }


Я слаб в функциях АПИ.Помогите.Ничего не могу найти.Где утечка?Вроде явного выделения памяти нет...
Делал уже и свой класс.В Функции рисования создавал обьект.Из выхода все ж должно было уничтожится вместе с обьектом.
Хелп!
Да ,еще при загрузке в таймере,при тесте,жестко "летит" оперативка.
Добавлено @ 16:49
Забыл
библиотеки #include <olectl.h> and <ole2.h>


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
maxim1000
Дата 16.4.2005, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата
Вроде явного выделения памяти нет...

GlobalAlloc - явное выделение памяти

попробуй вместо его использования выделить память один раз и навсегда
это даст информацию о том, является ли GlobalAlloc причиной утечки

P.S.
что бросилось в глаза:
1. s перед проверкой не инициализируется (или вместо комментариев должен быть какой-то код?)
2. в область памяти под hG что-то считывается, но потом не используется (в том числе и pp)


--------------------
qqq
PM WWW   Вверх
Coocky
Дата 16.4.2005, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



maxim1000
Цитата
s перед проверкой не инициализируется (или вместо комментариев должен быть какой-то код?)

Похрену...Я уже и нули присваивал.Так еще под 7.0 пишу.Обьявляю в классе.Студия сама инициализирует..
Цитата
2. в область памяти под hG что-то считывается, но потом не используется (в том числе и pp)

Ну и?Что делать?
Цитата
попробуй вместо его использования выделить память один раз и навсегда

Как?
Добавлено @ 19:51
Код

// CreateStreamOnHGlobal(hG,false,&s);

Цитата
s перед проверкой не инициализируется (или вместо комментариев должен быть какой-то код?)

Да раскоментировать надо.Забыл.Здесь забыл.



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 16.4.2005, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Пацаны,ну худею уже от нервного напряга!


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
maxim1000
Дата 17.4.2005, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



тогда такой вопрос: программа работает?
просто если работает, можно начинать отсекать ненужный код, что-то менять
если процедура не работает и к тому же позволяет утекать памяти, надо просто написать ее по-другому...


--------------------
qqq
PM WWW   Вверх
Coocky
Дата 17.4.2005, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



maxim1000
еще раз перечитай.
Все работает,но до определеного времени.Что отсекать?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
maxim1000
Дата 17.4.2005, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



попробуй убрать все, что имеет отношение к hG
у меня почему-то сильное ощущение, что оно только выделяется и освобождается


--------------------
qqq
PM WWW   Вверх
chipset
Дата 17.4.2005, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 2
Всего: 165



Не вижу чтобы указатель pp освобождался.
Попробуй создать кучу размером в 93 кб функцией HeapCreate, выдели из неё память HeapAlloc'ом.
И покажи функцию рисования ;)


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
maxim1000
Дата 17.4.2005, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата
Не вижу чтобы указатель pp освобождался

Цитата
Код

pp = (void*)hG;

а hG освобождается, вроде бы...
но я никак не могу понять, где информация, которая в него прочиталась, используется
а потому его лучше удалить, чтобы не мешал ошибку искать (кто его знает, может, и с ним связано)
если же чего-то недосмотрели (в смысле его использования), обязательно вылезет: программа ведь работающая, есть с чем сравнивать...


--------------------
qqq
PM WWW   Вверх
Coocky
Дата 17.4.2005, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Цитата
И покажи функцию рисования ;)

Функция возвращает обьект типа HBITMAP.А вот и фнкция pDC->BitBlt() smile
Цитата
Не вижу чтобы указатель pp освобождался

так вроде память-то под него не выделяется.Присваивается только
Цитата
Попробуй создать кучу размером в 93 кб функцией HeapCreate, выдели из неё память HeapAlloc'ом.
smile
Цитата
попробуй убрать все, что имеет отношение к hG

Ок.Но чувствую проблемы...


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
maxim1000
Дата 17.4.2005, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата
Ок.Но чувствую проблемы...

никаких проблем
есть 3 варианта:
1. программа станет работать без утечки памяти
2. программа будет работать так же, как и раньше
3. программа перестанет работать (или станет как-то совсем по-другому)

в первом случае проблем никаких - задача решена
во втором случае проблема остается, но функция становится более оптимальной
в третьем случае становится ясно, что работа как-то завязана на hG


--------------------
qqq
PM WWW   Вверх
Fire-Plug
Дата 18.4.2005, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: 1
Всего: 0



Цитата(Coocky @ 16.4.2005, 19:48)
.Так еще под 7.0 пишу.Обьявляю в классе.

Сразу скажу - код не смотрел. Решение предлагается - радикальное.
Если под 7.0 студией, возьми ATL класс CImage. Поддерживает достаточное к-во графич. форматов. Из файла он читает сам (т.е. имеет метод CImage::Load(const char *fileName)).
Все что нужно сделать после чтения, это - инициировать событие paint для окна вывода и в его обработчике нарисовать:
Код

COutptWnd::OnPaint(...)
{
   CDC dc(this);
   // m_image - объект класса CImage, загруженный ранее
   m_image.draw(dc, x0, y0, width, height, [константа типа STRETCH]);
}
// где
class COutptWnd : public CWnd

Пример записал по памяти, т.к. VC7 y меня на работе, дома VC6 (нет CImage). Подобный код у меня работает не 1000 раз, а 15 раз в сек. на протяжении часов, а иногда и суток.
ЗЫ: понятно, что трудно наступить на горло собственной песне, но если проект горит- все средства хороши.

Добавлено @ 08:51
Да, кстати, CImage также имеет перегруженный оператор HBITMAP. Всё, о чем остается подумать, это куда поместить объект собственно CImage, чтобы он был виден в ф-ции, но существововал за ее пределами (если привед. выше ф-ция LoadAnImage() - это С-ф-ция, а не метод класса).
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
Sun
Дата 18.4.2005, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: нет
Всего: 48



При вызове функции CopyImage в памяти выделяется место под картинку. После того как картинка уже не нужна - нужно очищать выделенную память через DeleteObject. У тебя в коде этого вызова нет. Наверно в этом и проблема утечки памяти.


--------------------
Account removed
PM MAIL   Вверх
Coocky
Дата 18.4.2005, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Попробую.Пока спасибо smile
Добавлено @ 22:11
Sun
Удалять hBB?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Sun
Дата 19.4.2005, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: нет
Всего: 48



Цитата(Coocky @ 18.4.2005, 19:07)
Sun
Удалять hBB?

Конечно. После того как он стает не нужен. Это можно делать в другой функции, но делать нужно обязательно. В MSDN написано
Цитата

When you are finished using the resource, you can release its associated memory by calling one of the functions in the following table.

Resource Release function
Bitmap      DeleteObject
Cursor      DestroyCursor
Icon          DestroyIcon

The system automatically deletes the resource when its process terminates, however, calling the appropriate function saves memory and decreases the size of the process's working set.



--------------------
Account removed
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.