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

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

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

Геннадий Пастухов, такое ощущение, что вы пришли из мира C, для него ваши замечания справедливы (с единственной поправкой на auto_ptr). Для C++ же существуют виртуальные деструкторы и множество вариантов шаблонов, позволяющие на N вызовов new в разных кусках кода иметь всего один delete. Про самодеятельность - это вы мимо. Степень потенциальных ошибок в C++ как раз пропорциональна количеству явных вызовов delete в коде.
Записан
ilot
Гость
« Ответ #16 : Январь 08, 2010, 14:24 »

Для C++ же существуют виртуальные деструкторы и множество вариантов шаблонов, позволяющие на N вызовов new в разных кусках кода иметь всего один delete. Про самодеятельность - это вы мимо.

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

можно поподробнее про шаблоны, позволяющие на N вызовов new делать один delete (примерчик желательно)?

Степень потенциальных ошибок в C++ как раз пропорциональна количеству явных вызовов delete в коде.

Ничего подобного. Главное не оставлять висячих указатель:
Код:
MyClass* p = new MyClass;
...
//do something
...
delete p;
p = 0;
...
if(p){
//действия с объектом через указатель
}
delete p;//p == 0, ничего не случится
Записан
Геннадий Пастухов
Гость
« Ответ #17 : Январь 08, 2010, 14:34 »

Геннадий Пастухов, такое ощущение, что вы пришли из мира C, для него ваши замечания справедливы (с единственной поправкой на auto_ptr). Для C++ же существуют виртуальные деструкторы и множество вариантов шаблонов, позволяющие на N вызовов new в разных кусках кода иметь всего один delete. Про самодеятельность - это вы мимо. Степень потенциальных ошибок в C++ как раз пропорциональна количеству явных вызовов delete в коде.

Ну история моя была несколько иной, начинал я с С++, потом уже был С, а потом опять С++. По следующему предложению: какое отношению к контролю памяти имеют виртуальные деструкторы? О каких шаблонах идёт речь, о template? Какое отношение они имеют к связке new/delete? Ты имеешь в виду, что, допустим, есть template list, который при помещении в него объектов делает new для каждого из них, а потом все их махом мы удаляем путем delete объекта шаблона? Это ровно то, о чём я писал - в этом случае delete будет делаться деструктором шаблона и количество new/delete будет равным.

Про количество вызовов delete тоже не совсем ясно, ты про вариант, когда мы удаляем объект, созданный не через new?
Записан
Dendy
Гость
« Ответ #18 : Январь 08, 2010, 14:36 »

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

А зачем вообще придумали виртуальные деструкторы? Ответом на этот вопрос будет и ответ на ваш.

можно поподробнее про шаблоны, позволяющие на N вызовов new делать один delete (примерчик желательно)?

Загляните в исходник того же QSharedDataPointer.

Ничего подобного. Главное не оставлять висячих указатель:

"Если бы всё было так просто всё не было бы так сложно" (с) О том и речь, что инструмент должен защищать программиста от случайных ошибок, а не говорить "сам дурак, оставил висячий указатель".
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


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

#define delete(p) delete p; p = 0;
Записан
Dendy
Гость
« Ответ #20 : Январь 08, 2010, 14:44 »

Геннадий Пастухов, вас немного не туда занесло. Программы пишутся для человека, а не для машины. Речь идёт о количестве записей new/delete в коде, а не о количестве их вызовов во время выполнения.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Геннадий Пастухов, такое ощущение, что вы пришли из мира C, для него ваши замечания справедливы (с единственной поправкой на auto_ptr). Для C++ же существуют виртуальные деструкторы и множество вариантов шаблонов, позволяющие на N вызовов new в разных кусках кода иметь всего один delete. Про самодеятельность - это вы мимо. Степень потенциальных ошибок в C++ как раз пропорциональна количеству явных вызовов delete в коде.
Я не считаю С "дурным тоном". И, конечно, контейнеры, шаблоны - дело великое и экономят массу времени. Но они тоже не идеальны. Например

Код:
QList <int> lst;
for (int i = 0; i < 1024 * 1024; ++i)
 lst.append(i);
...
lst.clear();  // это не освободит память

Так что иной раз и незатейливое new лучше. И согласен с Геннадием что delete должно делаться учитываться программистом "рефлекторно" на каждое new. И лучше освоить это твердо до прикручивания высокоуровневых классов а то "каша" получится.
« Последнее редактирование: Январь 08, 2010, 15:33 от Igors » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


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

>>И согласен с Геннадием что delete должно делаться программистом "рефлекторно" на каждое new.
этот рефлекс может породить проблемы в Qt, при работе с наследниками QObject.
Записан

Юра.
Dendy
Гость
« Ответ #23 : Январь 08, 2010, 15:01 »

И согласен с Геннадием что delete должно делаться программистом "рефлекторно" на каждое new.

Вы всё перепутали. На каждое new программист должен delete иметь в виду, а не писать явно в коде. Каким образом этот delete будет вызван во время выполнения - вопрос десятый, определяется не без чтения документации по используемому инструментарию. В основном это: 1) шаблоны, 2) виртуальные деструкторы и 3) явный delete, наличие которых в программе должно быть сведено к минимуму.
Записан
ilot
Гость
« Ответ #24 : Январь 08, 2010, 15:19 »

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

А зачем вообще придумали виртуальные деструкторы? Ответом на этот вопрос будет и ответ на ваш.

а я его не случайно задал.. Виртуальные деструкторы нужны в полиморфной иерархии, чтобы при работе с указателем на базовый объект вызывался деструктор не базового объекта, а именно того фактического объекта, на который данный указатель ссылается (на один new имеем один delete). Как это связывается с вашей фразой
Для C++ же существуют виртуальные деструкторы и множество вариантов шаблонов, позволяющие на N вызовов new в разных кусках кода иметь всего один delete.
от меня ускользает...
Записан
Dendy
Гость
« Ответ #25 : Январь 08, 2010, 15:25 »

ilot, http://www.prog.org.ru/index.php?topic=11963.msg75091#msg75091
Записан
Геннадий Пастухов
Гость
« Ответ #26 : Январь 08, 2010, 15:30 »

И согласен с Геннадием что delete должно делаться программистом "рефлекторно" на каждое new.

Вы всё перепутали. На каждое new программист должен delete иметь в виду, а не писать явно в коде. Каким образом этот delete будет вызван во время выполнения - вопрос десятый, определяется не без чтения документации по используемому инструментарию. В основном это: 1) шаблоны, 2) виртуальные деструкторы и 3) явный delete, наличие которых в программе должно быть сведено к минимуму.

Ну мы уже вдвоём просим пример, когда new в коде есть, а delete - нет, и при этом память корректно освобождается!
Записан
ilot
Гость
« Ответ #27 : Январь 08, 2010, 15:35 »

кхе..кхе. Вы просто рушите мое мировоззрение.. Улыбающийся И как же наличие виртуального деструктора позволит сократить количество вызовов delete в программе??

Ну мы уже вдвоём просим пример, когда new в коде есть, а delete - нет, и при этом память корректно освобождается!

Ну почему же, я тоже хотел бы посмотреть..
Записан
Dendy
Гость
« Ответ #28 : Январь 08, 2010, 15:36 »

Код
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 ноль.
Записан
Dendy
Гость
« Ответ #29 : Январь 08, 2010, 15:39 »

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

> вызовов

Как будто специально не читаете.

Речь идёт о количестве записей new/delete в коде, а не о количестве их вызовов во время выполнения.
Записан
Страниц: 1 [2] 3 4 ... 10   Вверх
  Печать  
 
Перейти в:  


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