crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Утекание памяти при использовании querySubObject
Гость_Саша_*
сообщение 16.6.2008, 20:35
Сообщение #1





Гости








    


Я использую ActivX компонент браузера. И хочу получать активный элемент. Для этого выполняю следующие действия:
CODE

QAxObject *Doc = pwb->querySubObject("Document");
QAxObject *activeElement = Doc->querySubObject("activeElement");

//... некоторые действия

delete activeElement;
delete Doc;

После этого кода память и утекает. Почему? Я же вроде всё, что взял удалил.
Причём, что интересно, если брать только документ, память не утекает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 17.6.2008, 7:59
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


А как ты определил, что память течет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Саша_*
сообщение 17.6.2008, 11:00
Сообщение #3





Гости








    


Цитата(ViGOur @ 17.6.2008, 7:59) *
А как ты определил, что память течет?


При помощи диспетчера задач. Чтоб было совсем ясно и сомнений не было насчёт того, что может это течёт не в том коде, который я привёл выше, я сделал следующее:

1) Я завёл таймер, с интервалом 100мс.
2) В обработчике выполняю приведённый выше код 100 раз.
3) По истечении 30 секунд перестаю выполнять вышепреведённый код в обработчике.
4) В момент истечения 30 секунд рисую на экране кружок...

Теперь всё это запускаю и смотрю на диспетчер задач. В течении 30 секунд он показывает весьма быстрое съедание памяти моей программой (за 30 секунд съедается около 3Мб) Потом появляется кружок и память перестаёт течь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 17.6.2008, 11:09
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


А ты не думал, что это может быть просто веделение памяти под activeElement, которое заложено под процесс рисования? :)

А не освобождается потому, что приложение "считает", что эту память оно сможет использовать еще для каких целей или уже использует...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Саша_*
сообщение 17.6.2008, 11:18
Сообщение #5





Гости








    


Что-то подобное думал. Тем более, что когда я выполняю программу под дебагером, после её завершения не показывается потеря памяти, хотя в других местах показывает...
Ну так, а что же делать. Дело в том, что как бы там ни было но память кушается и кушается и если оставить программу на долго, то Windows начинает ругаться, что мало виртуальной памяти, потом его начинает тошнить и всё...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 17.6.2008, 12:02
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Гость_Саша_* @ 17.6.2008, 12:18) *
Ну так, а что же делать. Дело в том, что как бы там ни было но память кушается и кушается и если оставить программу на долго, то Windows начинает ругаться, что мало виртуальной памяти, потом его начинает тошнить и всё...
А вот это уже не нормально, можете у тебя не в этом участке код, а где-то еще, ты случаем не копируешь объект activeElement где-нибудь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Саша_*
сообщение 17.6.2008, 12:14
Сообщение #7





Гости








    


Цитата(ViGOur @ 17.6.2008, 12:02) *
Цитата(Гость_Саша_* @ 17.6.2008, 12:18) *
Ну так, а что же делать. Дело в том, что как бы там ни было но память кушается и кушается и если оставить программу на долго, то Windows начинает ругаться, что мало виртуальной памяти, потом его начинает тошнить и всё...
А вот это уже не нормально, можете у тебя не в этом участке код, а где-то еще, ты случаем не копируешь объект activeElement где-нибудь?

Нет.
Прям в обработчике таймера беру, а потом удаляю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Саша_*
сообщение 17.6.2008, 12:44
Сообщение #8





Гости








    


Я вот думаю, может можно получить активный элемент не ф-ей querySubObject, а какой-нибудь другой? Только пока не знаю как.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Саша_*
сообщение 17.6.2008, 16:33
Сообщение #9





Гости








    


Если кому интересно, то я кажется нашёл.

Во-первых с версии 3.3.5 этого глюка наверное нет. А я работаю с 3.3.4.
Во-вторых глюк у них в деструкторе, точнее в ф-ии clear(). см:

http://trolltech.com/developer/resources/n.../changes-3.3.5/
Fixed a bug where QAxObject::clear() did not reset the metaobject when it was cached.

Мне пришлось извращаться и написать свой querySubObject, в котором я запрещаю для полученого объекта кэшировать. Код примерно следующий:
CODE

#include <qdict.h>
class QAxMetaObject;
struct querySubObjectEx
{
QAxObject *operator ()( QAxBase *objParent, const QCString &name, const QVariant &v1 = QVariant(),
const QVariant &v2 = QVariant(),
const QVariant &v3 = QVariant(),
const QVariant &v4 = QVariant(),
const QVariant &v5 = QVariant(),
const QVariant &v6 = QVariant(),
const QVariant &v7 = QVariant(),
const QVariant &v8 = QVariant() )
{
QAxObject *obj = objParent->querySubObject( name, v1, v2, v3, v4, v5, v6, v7, v8 );

if( obj!=NULL )
{
class QAxBasePrivate
{
public:
QDict<QAxEventSink> eventSink;
bool useEventSink :1;
bool useMetaObject :1;
bool useClassInfo :1;
bool cachedMetaObject :1;
bool initialized :1;
bool tryCache :1;

IUnknown *ptr;
IDispatch *disp;

QMap<QCString, bool> *propWritable;
QAxMetaObject *metaobj;
};
QAxBasePrivate *pd = (QAxBasePrivate*)(((QAxBase*)obj)->d);
pd->tryCache = 0;
}

return obj;
}
};


Использовать можно, например, так:

querySubObjectEx()(Document,"activeElement");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.6.2008, 16:47
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


тыб подписывал версию Qt, чтоль, а то народ голову ломает, думают про 4ку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2021, 21:31