Утекание памяти при использовании querySubObject |
Здравствуйте, гость ( Вход | Регистрация )
Утекание памяти при использовании 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
|
Гости |
А как ты определил, что память течет? При помощи диспетчера задач. Чтоб было совсем ясно и сомнений не было насчёт того, что может это течёт не в том коде, который я привёл выше, я сделал следующее: 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 |
Ну так, а что же делать. Дело в том, что как бы там ни было но память кушается и кушается и если оставить программу на долго, то Windows начинает ругаться, что мало виртуальной памяти, потом его начинает тошнить и всё... А вот это уже не нормально, можете у тебя не в этом участке код, а где-то еще, ты случаем не копируешь объект activeElement где-нибудь?
|
|
|
Гость_Саша_* |
17.6.2008, 12:14
Сообщение
#7
|
Гости |
Ну так, а что же делать. Дело в том, что как бы там ни было но память кушается и кушается и если оставить программу на долго, то 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
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
тыб подписывал версию Qt, чтоль, а то народ голову ломает, думают про 4ку
|
|
|
Текстовая версия | Сейчас: 21.12.2024, 17:37 |