LINUX.ORG.RU

С++ поведение деструктора?

 


0

3

Здравствуйте. Возник вопрос надеюсь вы сможете помочь. Деструктор по умолчанию в С++ вызывает деструкторы всех членов данных объявленных в классе. Если я определю деструктор например:

class A{
  std::vector<MyClass> V_;
  int num_;
public:
  A(){};
  ~A(){
    std::cout<<"Hello, World\n";
  }
}
при вызове деструктора объекта класса А будут вызваны детструкторы V_ и num_? Заранее благодарю.



Последнее исправление: mgalimullin (всего исправлений: 3)
Ответ на: комментарий от emulek

Как это соотноситься с обсуждаемыми в теме деструкторами? :)

BRE ★★
()
Ответ на: комментарий от ranka-lee

А если не нужно?

тогда будет чуть больше тактов и памяти жрать. Для нетривиального класса это не имеет значения.

emulek
()
Ответ на: комментарий от anonymous

Ты в каждом классе эти операторы описываешь?

да. Как private, если они мне (пока)не нужны.

Да ты, оказывается, совсем ненормальный.

нет, у меня редактор хороший, набирать просто и быстро. В notepad.exe было-бы тяжело, да.

emulek
()
Ответ на: комментарий от emulek

И что при добавлении, например, std::string ты идешь в оператор = или конструктор копирования и прописываешь копирование этой строки? и вот так в каждом классе? То есть и конструкторы копирования и обычное тоже всегда прописываешь? И всё в конструкторе копирования ручками прописываешь?

Ну и кто ты после этого, если не макака?

anonymous
()
Ответ на: комментарий от emulek

проблема будет в будущем, когда оно внезапно будет нужно.

Если проблема «внезапно» появляется после дизайна архитектуры, то, ВНЕЗАПНО, проблема уже была на этапе проектирования.

andreyu ★★★★★
()
Ответ на: комментарий от emulek

…то что-то ты сделал не так

Ну всякое бывает, exception safety обязывает. А так я вообще противник исключений.

Нужна инициализирующая функция например.

В С++11 не осталось ни одной причины их использовать, грамотного проектирования достаточно.

тогда new/delete будет закопано в этом unique_ptr. Как и указатель.

Ну да, но деструктор будет вызываться автоматически, в этом и фишка.

mix_mix ★★★★★
()
Ответ на: комментарий от emulek

А стоит? С тобой разговаривать — всё равно что с обезьяной в шашки играть. Пока что ты научился только повторять слово «валенок». Это ж сколько придётся тебя учить писать на C++?

i-rinat ★★★★★
()
Ответ на: комментарий от emulek

а как ты это проконтролируешь?

Обьявлю как final, например.

петя пишет коллекцию, которая содержит объекты васиного класса.

Если по значению, то никаких проблем.

DarkEld3r ★★★★★
()
Ответ на: комментарий от emulek

то почему вы пишите на C++, а не на ansi C ?

Ради шаблонов, например. Ну и кто говорит, что VT не нужна? Она просто нужна не везде.

DarkEld3r ★★★★★
()
Ответ на: комментарий от emulek

А в C++ всегда так: даже реализация простых списков на шаблонах тоже не настолько оптимальна, как реализация на чистой сишке. За абстракции всегда нужно платить.

Лол. Воинствующее невежество на марше. И не надо мне рассказывать про интрузивные списки. Они, внезапно, и на С++ с шаблонами отлично реализуются. Да и судя по твоей категоричности, спорить не о чем.

DarkEld3r ★★★★★
()
Ответ на: комментарий от emulek

Нужна инициализирующая функция например

с исплючением в конструкторе можно писать так:

do_something(some_class());
а если с „инициализирующая функция например“ то будет так
auto govno = some_class();
if (govno.init() < 0) {
  deinit_1000_things_initialized_before();
  deinit_one_more_shit();
  omg_omg_omg_panic();
  return EXIT_FAILURE;
}
do_something(govno);
govno.deinit();
return SUCCESS;
внимание вопрос: когда ты уже самозабанишся и не будешь срать в треды про спп?

anonymous
()
Ответ на: комментарий от i-rinat

в реальной системе в сотне-другой классов вот так мановением волшебной палочки деструкторы на невиртуальные поменяешь

говнокодеры обязаны страдать на пути к совершенному кодированию.

qulinxao ★★☆
()
Ответ на: опять ты лезешь со своими "советами" от anonymous

опять ты лезешь со своими «советами»

Человек просил пример. Я пример привел. Мог бы еще чего-нить рассказать. Но тут, смотрю, офигенные анонимные эксперты подтянулись, не буду им мешать громко пердеть в лужу.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Мог бы еще чего-нить рассказать

не надо :)

если дать определение some_class::impl прямо внутри some_class

anonymous
()
Ответ на: Мог бы еще чего-нить рассказать от anonymous

если дать определение some_class::impl прямо внутри some_class

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

Связно хоть что-то сможете сказать или в очередной раз смехуечками отделаетесь?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

по сути приведённого примера я уже всё сказал: ты не умеешь в pimpl. грамотным людям и так всё понятно, а неграмотным (типа тс-а) ты загаживаешь мозг. о чём и имею честь сообщить.

anonymous
()
Ответ на: комментарий от anonymous

по сути приведённого примера я уже всё сказал: ты не умеешь в pimpl

Демагогию, сударь, оставьте для тех несчастных, которые попадают к вам на собеседование.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

это не демагогия, а констатация факта. о деструкторах в крестах известно уже практически всё. но неосиляторы и дальше будут колхозить свои велосипеды.

anonymous
()
Ответ на: комментарий от anonymous

это не демагогия, а констатация факта.

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

о деструкторах в крестах известно уже практически всё.

Эта тема показывает, что известно далеко не всем.

но неосиляторы и дальше будут колхозить свои велосипеды.

Где вы в этой теме велосипеды увидели? Тем более в моем исполнении?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Эта тема показывает, что известно далеко не всем.

например, тебе. но это не мешает тебе лезть со своими «советами» в тему, в которой ты ничего не понимаешь.

Где вы в этой теме велосипеды увидели? Тем более в моем исполнении?

определение impl внутри родительского класса? есть идиома, которая требует чтобы а) определение деструктора было, б) в том месте где видно определение impl.

смысл термина «идиома» пояснять надо?

anonymous
()
Ответ на: комментарий от anonymous

например, тебе. но это не мешает тебе лезть со своими «советами» в тему, в которой ты ничего не понимаешь.

Демагогия на марше.

определение impl внутри родительского класса?

Где в моем примере родительский класс?

есть идиома, которая требует чтобы а) определение деструктора было, б) в том месте где видно определение impl.

Ну вот и расскажите это господину emulek-у. А то он задавался вопросом: «если в деструкторе нет delete и/или других нетривиальных зачисток ресурсов, то зачем вообще нужен деструктор?»

Когда pimpl реализуется посредством auto_ptr/unique_ptr, в деструкторе не будет написанного пользователем delete, деструктор будет пустым. Но он должен быть.

eao197 ★★★★★
()
Ответ на: комментарий от anonymous

есть идиома, которая требует чтобы а) определение деструктора было, б) в том месте где видно определение impl.

Ну и если уж речь пошла о велосипедах, то вот, пожалуйста, велосипед для pimpl-а, в котором не требуется явно определенного пользователем деструктора:

class some_class
{
	class impl;
	static void destroy_impl(impl *);

	std::unique_ptr< impl, void(*)(impl*) > impl_;

public :
	some_class();
};
eao197 ★★★★★
()
Ответ на: комментарий от eao197

Где в моем примере родительский класс?

some_class. возможно, я слишком вольно обошёлся с терминологией.

Ну вот и расскажите это господину emulek-у

зачем ему что-то рассказывать? он же наглухо упорот.

Когда pimpl реализуется посредством auto_ptr/unique_ptr

да что ж ты прицепился к несчастному pimpl и насилуешь его? это касается любых членов класса с нетривиальными деструкторами. простейший для понимания пример — умные указатели.

anonymous
()
Ответ на: комментарий от anonymous

some_class. возможно, я слишком вольно обошёлся с терминологией.

Опустим вопросы терминологии. Какие претензии к тому, что impl определяется внутри some_class? Какая религия запрещает это делать?

зачем ему что-то рассказывать? он же наглухо упорот.

Ваши отношения с emulek-ом — это ваши проблемы. Я счел нужным показать пример emulek-у. Пример оправданный. Ко мне какие претензии?

да что ж ты прицепился к несчастному pimpl и насилуешь его?

Всего лишь пытаюсь выяснить, что вам не понравилось в единственном примере, который был здесь мной приведен.

это касается любых членов класса с нетривиальными деструкторами.

Опять слишком вольное обращение с терминологией. Речь идет не о любых членах класса с нетривиальными деструкторами, а о членах класса, для которых деструкторы должен генерировать сам компилятор.

простейший для понимания пример — умные указатели.

Как раз поэтому я и привел пример с unique_ptr внутри. Но вы соизволили почему-то до него докупаться, хотя этот пример подтверждает ваши же слова.

Так какие претензии ко мне? Ваша ЧМОшная сущность опять дает о себе знать?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

рукалицо.jpg

ты сегодня хорошо себя чувствуешь?

ты «переименовал» деструктор в destroy_impl() за что поплатился утяжелением unique_ptr раза в 2 как минимум + разложил грабли следующим поколениям программистов из-за необходимой виртуальности деструктора impl.

anonymous
()
Ответ на: рукалицо.jpg от anonymous

ты «переименовал» деструктор в destroy_impl()

У вас явные проблемы с терминологией.

разложил грабли следующим поколениям программистов из-за необходимой виртуальности деструктора impl.

Как наличие или отсутствие destroy_impl влияет на виртуальность деструктора impl?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Опять слишком вольное обращение с терминологией.

уточню своё утверждение специально для тебя: «простейший для понимания пример» => «единственный доступный для твоего понимания»

У вас явные проблемы с терминологией.

грамматика? не, не знаю. прочитай в учебнике по русскому языку в каких случаях слова берутся в кавычки.

Как наличие или отсутствие destroy_impl влияет на виртуальность деструктора impl?

передаётся указатель на него?

anonymous
()
Ответ на: комментарий от anonymous

уточню своё утверждение специально для тебя: «простейший для понимания пример» => «единственный доступный для твоего понимания»

Опять демагогия. Не тратьте силы и время. Есть что сказать по существу  — говорите. Выпады в мой адрес лишь показывают степень вашей собственной ЧМОшности.

передаётся указатель на него?

А в unique_ptr, значит, хранится не указатель? И в std::default_delete передается не указатель?

Жгите еще.

eao197 ★★★★★
()
Ответ на: комментарий от emulek

я тоже, а как делать обработку ошибок?

В идеале как в Rust :3

mix_mix ★★★★★
()
Ответ на: комментарий от eao197

не стыдно быть таким тупым?

установлено:

1. ты не умеешь в pimpl

2. ты не умеешь в unique_ptr. в частности, не знаешь в чём принципиальное отличие дефолтного deleter-а.

риторические вопрос: да шо ж ты прицепился к этим несчастным указателям? где ты в объявлении unique_ptr '*' увидел?

это частный случай более общего понятия (также установлено, что это до тебя не доходит). если будешь вести себя вежливо, я, может быть, объясню.

anonymous
()
Ответ на: комментарий от eao197

А я гляжу у тебя тут тайный поклонник =))) Смотри, скоро под дверь начнет карточки подсовывать с текстами «ты всйо врешь!», «я знаю луччее!!!»

anonymous
()
Ответ на: не стыдно быть таким тупым? от anonymous

я, может быть, объясню.

Может быть — это очень точное выражение. Может быть сможете объяснить, может быть нет. Но, вспоминая ваш эпический фейл с фреймворком Akka, скорее нет.

Об этом же говорит и то, что у вас за все время участия в разборках на LOR-е не хватило смелости завести себе здесь аккаунт. Сделай вы такое, давно бы уже заработали карму emulek-а, если не хлеще.

А так же то, что в этой теме вы вообще ничего толкового не сказали, ни одного примера кода не привели.

Ну и фразы «где ты в объявлении unique_ptr '*' увидел?» заставляют думать, что в C++ вы разбираетесь ничуть не лучше, чем в actor model.

eao197 ★★★★★
()
Последнее исправление: eao197 (всего исправлений: 2)
Ответ на: комментарий от anonymous

«ты всйо врешь!», «я знаю луччее!!!»

И обязательно «ты не знаешь!!!» и «ты не умеешь!!!»

eao197 ★★★★★
()
Ответ на: комментарий от eao197

ваш эпический фейл с фреймворком Akka

ты о чём? явно не в себе сегодня.

Ну и фразы «где ты в объявлении unique_ptr '*' увидел?» заставляют думать

судя по продолжению фразы не заставляют.

показывай '*' в объявлении unique_ptr, балаболка.

anonymous
()
Ответ на: комментарий от anonymous

ты о чём?

Все ходы записаны

показывай '*' в объявлении unique_ptr, балаболка.

На cppreference забанили? Посмотрите. Например, на определение unique_ptr<T>::pointer:

pointer std::remove_reference<Deleter>::type::pointer if that type exists, otherwise T*

В свою очередь, эрудированный вы наш, прошу ответить на вопросы, заданные здесь. В первую очередь на вопросы «Какие претензии к тому, что impl определяется внутри some_class? Какая религия запрещает это делать?»

Если сможете сказать что-нибудь кроме выпадов в мой адрес, конечно.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Все ходы записаны

да, я не знаю что такое akka. ещё я не умею программировать на agda и coq. ты не умеешь в сертифицированные для гостайны библиотеки шифрования. и что?

На cppreference забанили? Посмотрите. Например, на определение unique_ptr<T>::pointer

как вопрос соотносится с «ответом». таки нет, '*' я там не вижу.

прошу ответить на вопросы, заданные здесь

сначала покажи '*' в определении unique_ptr. если не знаешь что такое определение (declaration) — спрашивай — объясню. даже несмотря на твоё хамство.

anonymous
()
Ответ на: комментарий от anonymous

да, я не знаю что такое akka.

Тем не менее, с умным видом рассуждаете про actor model.

С не менее умным видом вы рассуждаете и о C++.

Тенденция, однако...

ты не умеешь в сертифицированные для гостайны библиотеки шифрования.

А еще я не понимаю, что значить «уметь в»: «не умеешь в pimpl», «не умеешь в unique_ptr», «не умеешь в сертифицированные для гостайны библиотеки». Вы попробуйте выражать свои мысли на русском языке.

Кстати говоря, если вы имеете отношение к КриптоПро, то это многое объясняет в качестве их разработок.

таки нет, '*' я там не вижу.

Ну так посмотрите внимательнее. Разберитесь. Хотя бы в код STL-я вашего компилятора посмотрите. Там не так все сложно.

сначала покажи '*' в определении unique_ptr.

Уже показал. А вы, как и было предсказано, слились.

eao197 ★★★★★
()
Последнее исправление: eao197 (всего исправлений: 1)
Ответ на: комментарий от eao197

Тем не менее, с умным видом рассуждаете про actor model.

разница между моделью и реализацией приблизительно такая же как между объявлением и опеределением. но ты этого не поймёшь.

Уже показал.

лжёшь. у моего компилятора определение такое:

template <class T, class D = default_delete<T>> class unique_ptr;

anonymous
()
Ответ на: комментарий от anonymous

у моего компилятора определение такое:

опечатался в последнем предложении: объявление, конечно.

anonymous
()
Ответ на: комментарий от anonymous

лжёшь. у моего компилятора определение такое:

template <class T, class D = default_delete<T>> class unique_ptr;

Да уж, и этот человек обвиняет кого-то в незнании.

Внутри unique_ptr есть определение pointer-а. Которое раскрывается либо в T*, если нет типа D::pointer. Либо в D::pointer, если есть такая штука.

В приведенном мной примере используется unique_ptr<impl>, что раскрывается в unique_ptr<impl,default_delete<impl>>. Поскольку особой специализации std::default_delete для some_class::impl нет, то тип unique_ptr<impl,default_delete<impl>>::pointer будет ни чем иным, как impl*.

Хотя это наверняка за гранью вашего разумения.

Тем не менее, хотелось бы услышать ответы на мои вопросы. Или вы опять сольетесь?

eao197 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.