Russian Qt Forum
Ноябрь 26, 2024, 13:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: [РЕШЕНО] утечка памяти  (Прочитано 12809 раз)
unkeep
Гость
« : Июль 30, 2013, 12:11 »

Закралось сомнение,  будет ли память сама освобождаться в этих случаях? В замешательстве
1)
Код
C++ (Qt)
class SomeClass : public QObject
{
   SomeClass :SomeClass (int i, QObject *parent = 0);
}
SomeClass *a;
for (int i =0; i<maxVal; i++) {
   a = new SomeClass(i,parentObject); //  ???
   ///..........
   ///using a
   //..........
}

2)
Код
C++ (Qt)
class SomeClass
{
   SomeClass :SomeClass (int i);
}
SomeClass *a;
for (int i =0; i<maxVal; i++) {
a = new SomeClass(i);  //  ???
///..........
///using a
//..........
}
« Последнее редактирование: Июль 31, 2013, 12:28 от unkeep » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1 : Июль 30, 2013, 12:18 »

Если первый пример понимать как
Код
C++ (Qt)
class SomeClass : public QObject
{
   SomeClass::SomeClass (int i, QObject *parent = 0) : QObject(parent) {};
}
SomeClass *a;
for (int i =0; i<maxVal; i++) {
   a = new SomeClass(i,parentObject); //  ???
   ///..........
   ///using a
   //..........
}
то освободится при уничтожении parentObject, а второй как
Код
C++ (Qt)
class SomeClass
{
   SomeClass ::SomeClass (int i){};
}
SomeClass *a;
for (int i =0; i<maxVal; i++) {
a = new SomeClass(i);  //  ???
///..........
///using a
//..........
}
- не освободится.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Majestio
Гость
« Ответ #2 : Июль 30, 2013, 12:31 »

то освободится при уничтожении parentObject

Другая вариация вопроса:

Код
C++ (Qt)
// ------------------------------------------------------------
class P : public QObject
{
   P::P (QObject *parent = 0) : QObject(parent) {};
};
// ------------------------------------------------------------
class C : public QObject
{
   C::C (QObject *parent = 0) : QObject(parent) {};
};
// ------------------------------------------------------------
...
P *p = new P();
C *c = new C(p);
...
delete p;
...
// будет ли удалет и *с - если да, где прочесть в доках?
...
 
Записан
mutineer
Гость
« Ответ #3 : Июль 30, 2013, 12:46 »

c разрушится при уничтожении p
Записан
unkeep
Гость
« Ответ #4 : Июль 30, 2013, 13:32 »

Если первый пример понимать как
Код
C++ (Qt)
class SomeClass : public QObject
{
   SomeClass::SomeClass (int i, QObject *parent = 0) : QObject(parent) {};
}
SomeClass *a;
for (int i =0; i<maxVal; i++) {
   a = new SomeClass(i,parentObject); //  ???
   ///..........
   ///using a
   //..........
}
то освободится при уничтожении parentObject,

а если parent не уничтожается в ходе цикла? то с каждой итерацией будет выделена память? и вся она освободиться только после уничтожения parent? если да то получается чтоб освободить память перед новым выделением надо написать так?  :
Код
C++ (Qt)
for (int i =0; i<maxVal; i++) {
   delete a;
   a = new SomeClass(i,parentObject); //  ???
   ///..........
}
Записан
Majestio
Гость
« Ответ #5 : Июль 30, 2013, 13:33 »

c разрушится при уничтожении p

Умаляю - дайте пруф!  Показает язык
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Июль 30, 2013, 13:37 »

Умаляю - дайте пруф!  Показает язык
Документация. Конструктор 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.
« Последнее редактирование: Июль 30, 2013, 13:39 от Old » Записан
Bepec
Гость
« Ответ #7 : Июль 30, 2013, 13:43 »

+1 Old и mutineer.
Записан
Majestio
Гость
« Ответ #8 : Июль 30, 2013, 16:55 »

Документация. Конструктор QObject:

Не найду в доках, в каком месте описан механизм регистрации потомков в родителе. Я вот об этом...
Записан
mutineer
Гость
« Ответ #9 : Июль 30, 2013, 17:05 »

C *c = new C(p);

вот тут p указан как родитель для c. Этого достаточно для "регистрации"
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Июль 30, 2013, 17:08 »

Не найду в доках, в каком месте описан механизм регистрации потомков в родителе. Я вот об этом...
Там один метод setParent.
А сам механизм тривиален.

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Июль 30, 2013, 18:35 »

а если parent не уничтожается в ходе цикла? то с каждой итерацией будет выделена память? и вся она освободиться только после уничтожения parent? если да то получается чтоб освободить память перед новым выделением надо написать так?  :
Код
C++ (Qt)
for (int i =0; i<maxVal; i++) {
   delete a;
   a = new SomeClass(i,parentObject); //  ???
   ///..........
}
delete надо писать в конце итерации, а не в начале. плюс при таком подходе можно парента не указывать (либо ставить 0) и непонятно зачем объявлять переменную вне цикла.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
unkeep
Гость
« Ответ #12 : Июль 31, 2013, 12:13 »

а если parent не уничтожается в ходе цикла? то с каждой итерацией будет выделена память? и вся она освободиться только после уничтожения parent? если да то получается чтоб освободить память перед новым выделением надо написать так?  :
Код
C++ (Qt)
for (int i =0; i<maxVal; i++) {
   delete a;
   a = new SomeClass(i,parentObject); //  ???
   ///..........
}
delete надо писать в конце итерации, а не в начале. плюс при таком подходе можно парента не указывать (либо ставить 0) и непонятно зачем объявлять переменную вне цикла.
не удачный пример я привёл. На деле у меня память выделяется по нажатию кнопки, и потом в приложении эта память используется. Так вот если несколько раз нажимаем, то надо сначала освобождать память я так понимаю? даже если она не выделена ещё?
Записан
mutineer
Гость
« Ответ #13 : Июль 31, 2013, 12:15 »

Если ты попытаешься освободить невыделенную память, то будет ой
Записан
unkeep
Гость
« Ответ #14 : Июль 31, 2013, 12:17 »

Если ты попытаешься освободить невыделенную память, то будет ой
мда. уже попробовал... и проверить нельзя никак. как быть?
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.479 секунд. Запросов: 23.