Название: [РЕШЕНО] утечка памяти Отправлено: unkeep от Июль 30, 2013, 12:11 Закралось сомнение, будет ли память сама освобождаться в этих случаях? :-\
1) Код
2) Код
Название: Re: утечка памяти Отправлено: Kurles от Июль 30, 2013, 12:18 Если первый пример понимать как
Код то освободится при уничтожении parentObject, а второй как Код - не освободится. Название: Re: утечка памяти Отправлено: Majestio от Июль 30, 2013, 12:31 то освободится при уничтожении parentObject Другая вариация вопроса: Код
Название: Re: утечка памяти Отправлено: mutineer от Июль 30, 2013, 12:46 c разрушится при уничтожении p
Название: Re: утечка памяти Отправлено: unkeep от Июль 30, 2013, 13:32 Если первый пример понимать как Код то освободится при уничтожении parentObject, а если parent не уничтожается в ходе цикла? то с каждой итерацией будет выделена память? и вся она освободиться только после уничтожения parent? если да то получается чтоб освободить память перед новым выделением надо написать так? : Код
Название: Re: утечка памяти Отправлено: Majestio от Июль 30, 2013, 13:33 Название: Re: утечка памяти Отправлено: Old от Июль 30, 2013, 13:37 Умаляю - дайте пруф! :P Документация. Конструктор QObject:Цитировать The destructor of a parent object destroys all child objects. Документация. Деструктор QObject: Цитировать Destroys the object, deleting all its child objects. All signals to and from the object are automatically disconnected, and any pending posted events for the object are removed from the event queue. However, it is often safer to use deleteLater() rather than deleting a QObject subclass directly. Warning: All child objects are deleted. If any of these objects are on the stack or global, sooner or later your program will crash. We do not recommend holding pointers to child objects from outside the parent. If you still do, the destroyed() signal gives you an opportunity to detect when an object is destroyed. Warning: Deleting a QObject while pending events are waiting to be delivered can cause a crash. You must not delete the QObject directly if it exists in a different thread than the one currently executing. Use deleteLater() instead, which will cause the event loop to delete the object after all pending events have been delivered to it. Название: Re: утечка памяти Отправлено: Bepec от Июль 30, 2013, 13:43 +1 Old и mutineer.
Название: Re: утечка памяти Отправлено: Majestio от Июль 30, 2013, 16:55 Документация. Конструктор QObject: Не найду в доках, в каком месте описан механизм регистрации потомков в родителе. Я вот об этом... Название: Re: утечка памяти Отправлено: mutineer от Июль 30, 2013, 17:05 C *c = new C(p);
вот тут p указан как родитель для c. Этого достаточно для "регистрации" Название: Re: утечка памяти Отправлено: Old от Июль 30, 2013, 17:08 Не найду в доках, в каком месте описан механизм регистрации потомков в родителе. Я вот об этом... Там один метод setParent.А сам механизм тривиален. Название: Re: утечка памяти Отправлено: kambala от Июль 30, 2013, 18:35 а если parent не уничтожается в ходе цикла? то с каждой итерацией будет выделена память? и вся она освободиться только после уничтожения parent? если да то получается чтоб освободить память перед новым выделением надо написать так? : delete надо писать в конце итерации, а не в начале. плюс при таком подходе можно парента не указывать (либо ставить 0) и непонятно зачем объявлять переменную вне цикла.Код
Название: Re: утечка памяти Отправлено: unkeep от Июль 31, 2013, 12:13 а если parent не уничтожается в ходе цикла? то с каждой итерацией будет выделена память? и вся она освободиться только после уничтожения parent? если да то получается чтоб освободить память перед новым выделением надо написать так? : delete надо писать в конце итерации, а не в начале. плюс при таком подходе можно парента не указывать (либо ставить 0) и непонятно зачем объявлять переменную вне цикла.Код
Название: Re: утечка памяти Отправлено: mutineer от Июль 31, 2013, 12:15 Если ты попытаешься освободить невыделенную память, то будет ой
Название: Re: утечка памяти Отправлено: unkeep от Июль 31, 2013, 12:17 Если ты попытаешься освободить невыделенную память, то будет ой мда. уже попробовал... и проверить нельзя никак. как быть?Название: Re: утечка памяти Отправлено: mutineer от Июль 31, 2013, 12:18 можно проверить - обнуляй указатель при объявлении и при очистке. А потом проверяй на ноль
Название: Re: утечка памяти Отправлено: unkeep от Июль 31, 2013, 12:19 можно проверить - обнуляй указатель при объявлении и при очистке. А потом проверяй на ноль от. то что надо! ;DНазвание: Re: утечка памяти Отправлено: unkeep от Июль 31, 2013, 12:28 всем спасибо
Название: Re: [РЕШЕНО] утечка памяти Отправлено: kambala от Июль 31, 2013, 17:32 чтобы постоянно не присваивать указателю 0 после удаления, можно использовать QPointer
Название: Re: [РЕШЕНО] утечка памяти Отправлено: unkeep от Август 01, 2013, 11:06 чтобы постоянно не присваивать указателю 0 после удаления, можно использовать QPointer Раньше использовал QSharedPointer, но сейчас хочу понимать что за кулисами твориться)Ещё вопрос, если память выделяется локально в функции, то после отработки память подчистится? Код
Название: Re: [РЕШЕНО] утечка памяти Отправлено: kambala от Август 01, 2013, 11:27 если парент задан, то он удалит своих потомков в своем деструкторе, иначе нет. но можно задать виджету атрибут Qt::WA_DeleteOnClose чтобы он удалялся при закрытии.
модальные диалоги можно создавать на стеке. Название: Re: [РЕШЕНО] утечка памяти Отправлено: unkeep от Август 01, 2013, 11:34 модальные диалоги можно создавать на стеке. поясните последнюю строчку пожалуйста Название: Re: [РЕШЕНО] утечка памяти Отправлено: kambala от Август 01, 2013, 11:36 bool ShowMessage()
{ QMessageBox msgBox( /* params */); // можно и без парента return msgBox.exec(); } Название: Re: [РЕШЕНО] утечка памяти Отправлено: unkeep от Август 01, 2013, 12:00 bool ShowMessage() { QMessageBox msgBox( /* params */); // можно и без парента return msgBox.exec(); } с парентом всё понятно как раз: удалили родителя - удалились дети. а вот если просто несколько раз ShowMessage() вызвать в программе, то будет ли msgBox удаляться? Название: Re: [РЕШЕНО] утечка памяти Отправлено: kambala от Август 01, 2013, 12:06 при создании переменных на стеке их память автоматически очищается при выходе из области видимости
Название: Re: [РЕШЕНО] утечка памяти Отправлено: unkeep от Август 01, 2013, 12:11 как бы по идее объект не удалили, но ссылок на него не осталось так как его объявили локально в функции. во Flash например если ссылок не осталось на объект, то он удаляется через некоторое время сборщиком мусора. а тут как?
Название: Re: [РЕШЕНО] утечка памяти Отправлено: Bepec от Август 01, 2013, 12:15 Никак. Кривота программа будет полностью зависить от кривоты ваших рук.
Потерянный указатель никуда не денется до завершения работы программы. Потерю указателей/объекта называют утечкой памяти :) И при повторном выполнении кода память будет течь течь течь. Название: Re: [РЕШЕНО] утечка памяти Отправлено: kambala от Август 01, 2013, 12:18 как бы по идее объект не удалили, но ссылок на него не осталось так как его объявили локально в функции. во Flash например если ссылок не осталось на объект, то он удаляется через некоторое время сборщиком мусора. а тут как? а в С++ нет никакого сборщика мусора и подсчета ссылок. поизучай язык.Название: Re: [РЕШЕНО] утечка памяти Отправлено: unkeep от Август 01, 2013, 12:52 вы меня простите за примитивные на ваш взглят вопросы, но мне нужна помощь в понимании, а раздел соответствующий.
тут объект создаётся на стеке и следовательно удаляется при выходе из функции. Код
а тут в куче, и следовательно надо позаботиться о его удалении Код
1)правильно ? если да то вопрос №2 2)"на стеке не следует создавать больших объектов, дабы не переполнить стек". простой модальный диалог с пару кнопками и текстом можно считать мало объёмным? Название: Re: [РЕШЕНО] утечка памяти Отправлено: mutineer от Август 01, 2013, 13:03 1) да, правильно
Название: Re: [РЕШЕНО] утечка памяти Отправлено: Bepec от Август 01, 2013, 13:10 По второму вопросу - можно и достаточно большие объекты в стеке создавать. Где то видел размер стека по умолчанию, но не могу сказать.
PS пара десятков виджетов с графиками спокойно создаются в стеке ;) Название: Re: [РЕШЕНО] утечка памяти Отправлено: kambala от Август 01, 2013, 13:23 вы меня простите за примитивные на ваш взглят вопросы, но мне нужна помощь в понимании, а раздел соответствующий. вообще-то раздел соответствующий для Qt, а не для С++Название: Re: утечка памяти Отправлено: Majestio от Август 04, 2013, 16:20 Не найду в доках, в каком месте описан механизм регистрации потомков в родителе. Я вот об этом... Там один метод setParent.А сам механизм тривиален. Попробовал примерчик: Код
Вывод qDebug: A-constructor B-constructor A-destructor B-destructor Все верно. Регистрируется как родитель и удаляется родителем. Но ... почему последних два в таком порядке. Логичнее наверное сперва удалить всех потомков, потом только удалиться самому? Почему так? Название: Re: утечка памяти Отправлено: Old от Август 04, 2013, 16:27 Логичнее наверное сперва удалить всех потомков, потом только удалиться самому? Почему так? А так и происходит. Вызывается ваш деструктор A, который пишет сообщение, только потом вызывается деструктор QObject, который освобождает детей.Название: Re: утечка памяти Отправлено: Majestio от Август 04, 2013, 19:51 Логичнее наверное сперва удалить всех потомков, потом только удалиться самому? Почему так? А так и происходит. Вызывается ваш деструктор A, который пишет сообщение, только потом вызывается деструктор QObject, который освобождает детей.Все верно, запутался - думал порядок как и с классическим наследованием ;D Пример без QObject. Два класса - A, B (наследуется от А), на следующем коде: Код
Порядок симметричный: A-Constructor B-Constructor B-Destructor A-Destructor Если бы А наследовался от QObject, значит дальше бы пошли деструкторы от чайлдов. |