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

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

Страниц: 1 2 [3] 4 5 ... 10   Вниз
  Печать  
Автор Тема: Основы удаления объектов  (Прочитано 81525 раз)
ilot
Гость
« Ответ #30 : Январь 08, 2010, 15:43 »

> вызовов

Как будто специально не читаете.
переформулирую вопрос:
И как же наличие виртуального деструктора позволит сократить количество записей delete в программе??

Записан
Dendy
Гость
« Ответ #31 : Январь 08, 2010, 15:45 »

На один пост выше.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Январь 08, 2010, 15:46 »

>>И согласен с Геннадием что delete должно делаться программистом "рефлекторно" на каждое new.
этот рефлекс может породить проблемы в Qt, при работе с наследниками QObject.
Есть правила, есть исключения. Но исключения не значат что можно обойтись без правил.
Записан
ilot
Гость
« Ответ #33 : Январь 08, 2010, 15:52 »

Код
C++ (Qt)
int main( int argc, char ** argv )
{
   QApplication app( argc, argv );
   QWidget widget;
   new QLabel( &widget ); // here
   widget.show();
   return app.exec();
}
 
да, приходится учитывать особенности фреймфорка, с которым работаешь. Но здесь еще вопрос что лучше: запомнить раз и навсегда, что для каждого new должна выполняться зачистка, либо запоминать в каких случаях библиотека все сделает за тебя, а когда нужно вызывать деструктор самому (и так для каждой библиотеки, а их довольно много). ИМХО, если приоритетным выбирать 2-й вариант действий, то напортачить гораздо проще и найти ошибку сложнее будет.

На один пост выше.
причем здесь виртуальный деструктор ?
« Последнее редактирование: Январь 08, 2010, 15:55 от ilot » Записан
Dendy
Гость
« Ответ #34 : Январь 08, 2010, 16:21 »

Есть стандарт C++, виртуальные деструкторы и шаблоны - часть этого стандарта. Фреймфорк, в данном случае Qt, ни на шаг не отклоняется от семантики использования этих возможностей. Правила на 100% определяются документацией к классам библиотеки. Каждый вызов метода и каждый подставляемый в этот метод параметр строго определяют действие, которое будет выполнено. И если документация к методу гласит, что деструктор будет вызван автоматически - так оно и будет. Любое отклонение от этих правил и есть та самая самодеятельность, влекущая ошибки, ибо вы сами не поймёте через время зачем написали так, когда библиотека подразумевает делать иначе.

Что касается new/delete в коде. Идеальная программа - в которой нет ни одного явного вызова delete вообще.

причем здесь виртуальный деструктор ?

Пусть это будет вам задание на дом.
Записан
ilot
Гость
« Ответ #35 : Январь 08, 2010, 16:51 »

мой вопрос, повторяемый из сообщения в сообщение:
Цитировать
причем здесь виртуальный деструктор??

ваши ответы:
Цитировать
А зачем вообще придумали виртуальные деструкторы? Ответом на этот вопрос будет и ответ на ваш.
Цитировать
ссылающийся на:
Программы пишутся для человека, а не для машины. Речь идёт о количестве записей new/delete в коде, а не о количестве их вызовов во время выполнения.
> вызовов

Как будто специально не читаете.
На один пост выше.
(причем здесь этот пост?)
и в завершение
Пусть это будет вам задание на дом.

Смеющийся

Я знаю для чего нужны виртуальные деструкторы и выше написал об этом. Концепция виртуальных деструкторов не имеет никакого отношения к автоматическому удалению объектов, поэтому мне так и не понятно для чего вы прилепили их в общую кучу к шаблонам и неявным вызовам delete, выполняемых фреймворком.
Записан
Геннадий Пастухов
Гость
« Ответ #36 : Январь 08, 2010, 17:00 »

Код
C++ (Qt)
int main( int argc, char ** argv )
{
   QApplication app( argc, argv );
   QWidget widget;
   new QLabel( &widget ); // here
   widget.show();
   return app.exec();
}
 

Количество в коде new одно, количество в коде delete ноль.

Совершенно верно, и при этом моим словам это не противоречит. Ты привёл пример создания иерархии объектов, в которой за очисткой памяти следит фреймворк. Когда же мы создаём одиночный объект, то не важно, чей он потомок, сам собой он удалится только в одном случае - при всё том же вызове деструктора. И, в общем случае, это произойдёт при завершении работы программы. Так что помнить об этом нужно непременно.

Ну и, строки вида
Код
C++ (Qt)
new QLabel( &widget ); // here
, конечно, вполне корректны с точки зрения Qt, но с точки зрения С++ нехорошо смотрятся Улыбающийся Я бы всё-таки написал
Код
C++ (Qt)
QLabel lbl = new QLabel( &widget ); // here
, ведь мы, всё же, используем С++, и, думаю, лучше всегда пользоваться его соглашениями при оформлении кода.
Записан
niXman
Гость
« Ответ #37 : Январь 08, 2010, 18:47 »

детский сад, честное слово...

ilot, именно вам я давал ссылки по теме. повторю:
1. http://ru.wikipedia.org/wiki/Абстрактная_фабрика_(шаблон_проектирования)
2. http://ru.wikipedia.org/wiki/Строитель_(шаблон_проектирования)
3. http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)
эти три паттерна, плюс принцип RAII(http://ru.wikipedia.org/wiki/RAII), избавляют программиста от головной боли и утечек памяти.

так же по теме, что будет как минимум полезно, еще это порекомендую:
http://ru.wikipedia.org/wiki/Объектный_пул
http://ru.wikipedia.org/wiki/Прототип_(шаблон_проектирования)

а еще лучше, прочесть всю тему:
http://ru.wikipedia.org/wiki/Шаблоны_проектирования

кто напишет wiki?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Январь 08, 2010, 20:39 »

детский сад, честное слово...

ilot, именно вам я давал ссылки по теме. повторю:
...
так же по теме, что будет как минимум полезно, еще это порекомендую:
...
а еще лучше, прочесть всю тему:
...
niXman. я против Вас ничего не имею, но мне кажется, что детский сад - это те ссылки которые Вы даете  Улыбающийся
Да, слова там везде хорошие и правильные и они от реальной практики. Только вот применимо это все в одном случае - "за спиной" мощного инструментария (типа Qt) который делает 80% того что требуется. Вот тогда очень хорошо/удобно покалякать о "концепциях", "сущностях" и.т.п.

Но все это проходит "как с белых яблонь дым" как только выйти за рамки стандартных задач. Попробуйте напр. написать просто ListBox "с нуля", т.е. используя только ф-ции рисования и базовые events (мне приходилось и не потому что хотел) - и уверяю Вас, от книжной идейности останутся "рожки да ножки". И Вам уже будет не до менторского "порекомендую" - а чтобы оно "абы как но работало".

ilot и Геннадий правильно поясняют что есть "основы" которыми нужно владеть в полной мере. А нахвататься умных классов библиотеки - там и помогать не надо  Улыбающийся
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #39 : Январь 08, 2010, 20:49 »

Итак посмотрим что тут у нас:
widget.h
Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class QTextEdit;
class QComboBox;

class widget:public QWidget
{
    Q_OBJECT
public:
    widget(QWidget *parent=0);
    ~widget();
    QTextEdit *text;
    QComboBox *combo;

private slots:
    void crash();
};

#endif // WIDGET_H

widget.cpp
Код:
#include <QtGui>
#include "widget.h"

widget::widget(QWidget *parent):QWidget(parent)
{
    text=new QTextEdit(this);
    combo=new QComboBox(this);
    qDebug()<<connect(text,SIGNAL(destroyed()),this,SLOT(crash()));
    qDebug()<<connect(combo,SIGNAL(destroyed()),this,SLOT(crash()));
}

void widget::crash()
{
    static int num=0;
    qDebug()<<"Crashed number "+QString::number(num);
    ++num;
}

widget::~widget()
{
    qDebug()<<"Widget Crashed!";
}

main.cpp
Код:
#include <QtGui>
#include "widget.h"

int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
    widget w;
    w.show();
    app.exec();
    return 0;
}

Компилируем программу и опа..объект widget удаляется, а его дочерние объекты нет! Хотя заданы явно..
Цитировать
text=new QTextEdit(this);
    combo=new QComboBox(this);

В деструктор widget добавляем, например delete text; и на консоль выводится нужное "Crashed number 0"..
Господа, что же это значит? Я так понимаю, что не стоит надеяться на фрэймворк и явно вызывать delete, как это принято в стандарте C++..есть другие мнения?
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
BRE
Гость
« Ответ #40 : Январь 08, 2010, 21:02 »

В деструктор widget добавляем, например delete text; и на консоль выводится нужное "Crashed number 0"..
Господа, что же это значит? Я так понимаю, что не стоит надеяться на фрэймворк и явно вызывать delete, как это принято в стандарте C++..есть другие мнения?
Можно и явно вызывать, при разрушение дочерний уберет себя из списка в родительском виджете.

Или измени код например так:
main.cpp
Код
C++ (Qt)
#include <QtGui>
#include "widget.h"
 
int main(int argc,char* argv[])
{
   QApplication app(argc,argv);
   widget *w = new widget;
   w->show();
   app.exec();
   delete w;
   return 0;
}
 

Кстати, можно писать просто:
Код
C++ (Qt)
   qDebug() << "Crashed number " << num;
 
« Последнее редактирование: Январь 08, 2010, 21:05 от BRE » Записан
niXman
Гость
« Ответ #41 : Январь 08, 2010, 21:04 »

Цитировать
"за спиной" мощного инструментария (типа Qt) который делает 80% того что требуется.
тогда о чем речь? о непонимании концепции Qt? или общего непонимания стратегии проектирования приложения?

Цитировать
Попробуйте напр. написать просто ListBox "с нуля"
могу попробовать(уже пробовал и не раз) что-то другое, алгоритмичное. просто не люблю ГУЙ писать Улыбающийся

Цитировать
И Вам уже будет не до менторского "порекомендую" - а чтобы оно "абы как но работало".
тут я с вами не соглашусь!
я сторонник "идеального" кода. и если есть два способа реализовать задачу, при том один простой, другой правильный - я выберу второй. даже если для этого придется написать в пять раз больше кода.

Цитировать
А нахвататься умных классов библиотеки - там и помогать не надо
в данном случае это относится к Qt.

и общая суть вашего комментария, понятна. и из него, так же понятно, что вы не очень хорошо понимаете процесс проектирования, отсюда и не понимание применения на практике концепции шаблонов проектирования. замечу, что по приведенным мною ссылкам, шаблоны проектирования, это именно концепт! так как применяются они не только в программировании. ничего против вас не имею. простите если что не так.
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #42 : Январь 08, 2010, 21:10 »

BRE, изменил код как сказали, удаления дочерних объектов не произошло..короче нафиг эти иерархии объектов, что-то непонятное с ними (либо я чего-то не понимаю)..Может кто-нибудь скажет как в приведенном мною коде все правильно организовать, чтобы widget удалял дочерние объекты автоматически?
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #43 : Январь 08, 2010, 21:15 »

В деструктор widget добавляем, например delete text; и на консоль выводится нужное "Crashed number 0"..
Господа, что же это значит? Я так понимаю, что не стоит надеяться на фрэймворк и явно вызывать delete, как это принято в стандарте C++..есть другие мнения?
Это не тот вопрос который решается мнением/голосованием  Улыбающийся  Выложите пожалуйста компилябельный проект, попробуем разобраться. Все children должны быть удалены parent'ом, Qt это гарантирует. Нельзя удалять что уже удалено
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #44 : Январь 08, 2010, 21:18 »

http://rghost.ru/806868 вот проект..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Страниц: 1 2 [3] 4 5 ... 10   Вверх
  Печать  
 
Перейти в:  


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