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

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

Страниц: 1 ... 7 8 [9] 10   Вниз
  Печать  
Автор Тема: Основы удаления объектов  (Прочитано 85961 раз)
Dendy
Гость
« Ответ #120 : Январь 10, 2010, 13:30 »

Один delete в main() на все два new - для Derived1 и Derived2. Что и требовалось доказать.
Записан
BigZ
Гость
« Ответ #121 : Январь 10, 2010, 13:31 »

Отличный пример, спасибо. То что я ожидал увидеть. Как видим - 2 new, 1 delete, что и требовалось доказать.
class Foo: public QObject{
public:
   Foo(QObject* pobj = 0) {}
   ~Foo(){}
};

class Foo2: public QObject{
public:
   Foo2(QObject* pobj = 0) {}
   ~Foo2(){}
};

int main(int argc, char *argv[])
{
   QObject* pobj = new Foo;
   QObject* pobj2 = new Foo2;
   QObject* temp;
   temp = pobj;
   pobj = pobj2;
   pobj2 = temp;
   //do something...
   delete pobj;
   delete pobj2;
}

Функция deleteQObject была нужна чтобы показать, что пример с Foo()
"Демонстрирует возможности виртуального деструктора".
Я рад, что вы наконец с этим согласились и приняли этот пример.
Новый пример показывает реальную возможность обмена между двумя
переменными одного типа. Как видим тут используется два new и два delete.
Записан
ilot
Гость
« Ответ #122 : Январь 10, 2010, 13:34 »

Один delete в main() на все два new - для Derived1 и Derived2. Что и требовалось доказать.
где вы видите два new в main?? Шокированный

Напоминаю вам ваши же слова: "речь идет о количестве записей new/delete в коде"
« Последнее редактирование: Январь 10, 2010, 13:35 от ilot » Записан
Dendy
Гость
« Ответ #123 : Январь 10, 2010, 13:40 »

Изначально вопрос стоял как: отношение количества new на количество delete не одно у одному. Отношение N к M, где N и M - независящие друг от друга числа. Если в вашем примере сделать grep new и grep delete и их количество совпадёт, то разве что случайно. Присмотревшись мы именно это и видим.
Записан
Dendy
Гость
« Ответ #124 : Январь 10, 2010, 13:40 »

ilot, мы с вами не в суде.
Записан
ритт
Гость
« Ответ #125 : Январь 10, 2010, 13:42 »

9 страниц ни о чём. мб пора уже закрыть тему?
Записан
Dendy
Гость
« Ответ #126 : Январь 10, 2010, 13:44 »

BigZ, всё хорошо, только маленькое "но". Если убрать виртуальный деструктор и заменить QObject*pobj и QObject*pobj2 на Foo*pobj и Foo2*pobj2, то (пабам!) код остаётся таким же рабочим и снова неясен смысл виртуальных деструкторов.
Записан
Dendy
Гость
« Ответ #127 : Январь 10, 2010, 13:46 »

Константин, пожалуйста без офтопа.
Записан
BigZ
Гость
« Ответ #128 : Январь 10, 2010, 13:49 »

BigZ, всё хорошо, только маленькое "но". Если убрать виртуальный деструктор и заменить QObject*pobj и QObject*pobj2 на Foo*pobj и Foo2*pobj2, то (пабам!) код остаётся таким же рабочим и снова неясен смысл виртуальных деструкторов.
Не согласен. Если сделать так, то программа не скомпилируется. Не возможно в ссылке Foo2 хранить ссылку на Foo.
Записан
ilot
Гость
« Ответ #129 : Январь 10, 2010, 13:50 »

есть ТЗ:
Написать пример, в котором:

а) демонстрируется использование виртуального деструктора в классе;
б) количество new/delete в коде для этого класса (или его наследников) совпадало.
есть реализованный пример. Остальное демагогия.
9 страниц ни о чём. мб пора уже закрыть тему?
согласен, говорить давно уже не о чем

P.S. разве что голосование провести
« Последнее редактирование: Январь 10, 2010, 13:54 от ilot » Записан
Dendy
Гость
« Ответ #130 : Январь 10, 2010, 13:54 »

BigZ, всё хорошо, только маленькое "но". Если убрать виртуальный деструктор и заменить QObject*pobj и QObject*pobj2 на Foo*pobj и Foo2*pobj2, то (пабам!) код остаётся таким же рабочим и снова неясен смысл виртуальных деструкторов.

Хотя, нет, облажался, не совсем так. Имелось в виду конечно же, если указатели не меняются в процессе работы. Другими словами, новичёк задаёт вопрос:

А зачем менять указатели друг на друга, если можно просто создать две другие переменные:

Код
C++ (Qt)
int main(int argc, char *argv[])
{
  Foo* pobj = new Foo;
  Foo2* pobj2 = new Foo2;
 
  QObject* pobjCopy = something ? pobj : pobj2;
  QObject* pobj2Copy = something ? pobj2 : pobj;
  //do something...
 
  delete pobj;
  delete pobj2;
}
 

И задача будет точно так же выполняться.
Записан
Dendy
Гость
« Ответ #131 : Январь 10, 2010, 13:57 »

ilot, под одинаковым количество имелось в виду соответствие на каждый new свой delete.
Записан
BigZ
Гость
« Ответ #132 : Январь 10, 2010, 14:08 »

Хотя, нет, облажался, не совсем так. Имелось в виду конечно же, если указатели не меняются в процессе работы. Другими словами, новичёк задаёт вопрос:

А зачем менять указатели друг на друга, если можно просто создать две другие переменные:

Код
C++ (Qt)
int main(int argc, char *argv[])
{
  Foo* pobj = new Foo;
  Foo2* pobj2 = new Foo2;
 
  QObject* pobjCopy = something ? pobj : pobj2;
  QObject* pobj2Copy = something ? pobj2 : pobj;
  //do something...
 
  delete pobj;
  delete pobj2;
}
 
Опять не согласен. Во первых ваш пример всё ещё не компилируется, так как не ясно,
что такое "something". Во вторых вы мой пример отрефакторили не оптимально и сделали его хуже.
У меня используется только одна временная переменная temp а у вас две pobjCopy и pobj2Copy.
Плюс мою переменную можно использовать дальше для других целей, а у вас эти
переменные всегда заняты. В третьих ваша пример будет работать не так как мой. Так как у меня
вызывается вначале деструктор Foo2 а потом Foo.

И ещё четвёртое. В вашем примере всё равно 2 оператора new и 2 оператора delete. Что и требовалось доказать.
« Последнее редактирование: Январь 10, 2010, 14:18 от BigZ » Записан
Dendy
Гость
« Ответ #133 : Январь 10, 2010, 14:53 »

BigZ, код - не самоцель. Цель - задача, которую код призван выполнять.

не ясно, что такое "something"
Это неважно.

Во вторых вы мой пример отрефакторили не оптимально и сделали его хуже.
Отличный аргумент! Но у меня есть контраргумент - я сделал его лучше.

У меня используется только одна временная переменная temp а у вас две pobjCopy и pobj2Copy. Плюс мою переменную можно использовать дальше для других целей, а у вас эти переменные всегда заняты.
Это не есть цель задачи.

В третьих ваша пример будет работать не так как мой. Так как у меня вызывается вначале деструктор Foo2 а потом Foo.
Это единственное, что имеет смысл - виртуальными деструкторами можно выбирать порядок их вызова. Хотя в реальной задаче применение этому вижу с трудом.

И ещё четвёртое. В вашем примере всё равно 2 оператора new и 2 оператора delete. Что и требовалось доказать.
Не спешите. В моём коде отсутствуют виртуальные деструкторы.
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #134 : Январь 13, 2010, 23:26 »

А вот такой вопрос: есть указатели, которые не были созданы с помощью new, а просто приняли адрес объекта - что с ними делать? delete не нужен же?
Например: Object *a2=a1;
Записан

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

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


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