Здравствуйте, Erop, Вы писали:
E>Здравствуйте, sts, Вы писали:
А>>>>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?
E>>>на пример, если объёкт создали на компе, установленном на борут ГЧ, достигшей цели
sts>>так ведь и delete не успели сделатьт, так что это не в счет E>Ты ТС или просто рассуждаешь? E>Я так понял, что ТС спросил, когда может так получится, что у созхданного С++ объекта не будет вызван деструктор. при этом случай с забытым delete, он считал тривиальным и просил на него не отвлекаться. на этот вопрос я и ответил...
брутально, можно было никого не взрывать, а просто комп из розетки выдернуть
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, sts, Вы писали:
EP>>>
EP>>>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
EP>>>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.
EP>>>Технически никому он ничего не должен, особенно если: EP>>>1. он protected sts>>тогда не получится "удалять через указатель на базовый класс"
A>не подменяйте тему. A>в цитате написано не "удалять", а разрушать. A>это разные вещи.
V>>Это все понятно. Полагаю, вы слишком формально подходите к статье, и вас смутило слово 'должен'. Но по сути, описано хорошее правило делать деструктор виртуальным в случае полиморфных типов. Можно использовать обычный деструктор, если вы точно уверены, как именно ваша иерархия классов будет использоваться или в целях оптимизации.
A>хорошее правило — это 'не делать того что не нужно делать' или 'делать только то что нужно делать'. A>если виртуальный деструктор не нужен, то незачем его делать.
в данном случае это надо делать (делать деструктор виртуальным), т.к. большинство разработчиков этого ожидают
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, rg45, Вы писали:
A>>>это не может быть следствием, т.к. `delete pointer-to-base-type;` это не единственный способ корректно разрушить объект через указатель на его базовый класс.
R>>Вероятно, ты имеешь ввиду технику, подобную той, которая применяется в shared_ptr? Ну так в ней разрушение объекта производится как раз через указатель most derived класса (при правильно использовании, при неправильном можно получить все то же UB). При этом сам shared_ptr я бы рассматривал не как способ разрушения объекта, а как средство абстрагирования от деталей этого процесса.
R>>Или ты что-то другое имеешь в виду? Ну тогда поделись, как еще можно разрушить объект через указатель на его базовый класс.
A>да, удалять объект можно с помощью deleter'а с type-erasure как у shared_ptr, A>причем *внезапно* shared_ptr<BaseClass> это *указатель* на базовый класс.
A>еще объект может владеть сам собой (встроенный счетчик ссылок и delete this, как например в COM), A>объект может удалять какой-то GC (напр. Arena GC), впрочем это опять же deleter.
A>много в общем разных способов.
нету в shared_ptr удаления через указатель на базовый класс — там базовый класс кастуется к нужному прежде чем удалить
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, rg45, Вы писали:
A>>>>>
A>>>>>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>>>>>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.
R>>Да, к сожалению, авторы статьи не дали четкого определения, что они понимают под полиморфным классом. Из общего контекста статьи можно догадаться, что они вкладывали в это понятие более широкий смысл — класс, объекты которого могут не только использоваться, но и удаляться через указатель базового класса (именно этому вопросу в статье уделено много внимания). Конечно же, это недочет, неточность формулировки, но еще не повод разбрасываться ярлыками типа "чушь" и "говносайт".
A>вот поэтому статья и говно, раз там написана чушь наподобие "раз полиморфный — значит ДОЛЖЕН быть виртуальный деструктор". A>про весь сайт я может погорячился, хотя раз там есть статья такого качества — наверное и весь сайт такой.
A>у термина "полиморфный (класс)" есть вполне конкретное определение. A>то что на это определение наложено ограничение, что объекты потомков такого класса будут удаляться через delete — это называется "более узкий смысл".
ожидается, что деструктор будет полиморфным
так же как ожидается, что из него не будет выкинуто исключение
Здравствуйте, Аноним, Вы писали:
А>Помогите новичку! А>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?
Деструкторы могут не вызываться при создании массива с помощью оператора new[] и удалении его(массива) с помощью оператора delete.
Пример:
class A
{
public:
~A(){}
};
int main()
{
A* a = new A[100500];
...
delete a; // should be delete[] a;
}
Здравствуйте, sts, Вы писали:
V>>>Это все понятно. Полагаю, вы слишком формально подходите к статье, и вас смутило слово 'должен'. Но по сути, описано хорошее правило делать деструктор виртуальным в случае полиморфных типов. Можно использовать обычный деструктор, если вы точно уверены, как именно ваша иерархия классов будет использоваться или в целях оптимизации.
A>>хорошее правило — это 'не делать того что не нужно делать' или 'делать только то что нужно делать'. A>>если виртуальный деструктор не нужен, то незачем его делать.
sts>в данном случае это надо делать (делать деструктор виртуальным), т.к. большинство разработчиков этого ожидают
большинство разработчиков (С++) не знают С++, не знают стандартную библиотеку и называет шаблоны магией, ну и что?
не надо равняться на таких людей.
Здравствуйте, sts, Вы писали:
A>>у термина "полиморфный (класс)" есть вполне конкретное определение. A>>то что на это определение наложено ограничение, что объекты потомков такого класса будут удаляться через delete — это называется "более узкий смысл".
sts>ожидается, что деструктор будет полиморфным sts>так же как ожидается, что из него не будет выкинуто исключение
*тобой* ожидается? да кого это волнует
In Zen We Trust
Re[5]: Разрушение компа прежде, чем будет разрушен объект, покатит? ;)
Здравствуйте, sts, Вы писали:
sts>брутально, можно было никого не взрывать, а просто комп из розетки выдернуть
Это какой-то форс-мажор, на который не понятно, надо ли рассчитывать вообще при проектировании ПО для этого компа.
А вот на то, что ГЧ поразит таки цель, авторам её ПО рассчитывать стоит...
Впрочем, если тебя пугает брутальность, есть более мягкий вариант. Кроме БЧ есть много других устройств, в которых останов ПО не предусмотрен. То есть раз запущенное оно крутится на устройстве до конца его функционирования, либо до аппаратного сбоя/холодного рестарта. Там вызов дестукторов статических объектов обычно тоже не прежусмотрен,..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Abyx, Вы писали:
sts>>ожидается, что деструктор будет полиморфным sts>>так же как ожидается, что из него не будет выкинуто исключение
A>*тобой* ожидается? да кого это волнует
А какой профит делать публичный невиртуальный деструктор если vtbl уже есть в классе?
Я могу представить пару очень особенных случаев, но даже про них не уверен что оно того стоит.
Здравствуйте, doarn, Вы писали:
D>Здравствуйте, Abyx, Вы писали:
sts>>>ожидается, что деструктор будет полиморфным sts>>>так же как ожидается, что из него не будет выкинуто исключение
A>>*тобой* ожидается? да кого это волнует
D>А какой профит делать публичный невиртуальный деструктор если vtbl уже есть в классе? D>Я могу представить пару очень особенных случаев, но даже про них не уверен что оно того стоит.
про "публичный" никто не говорил.
впрочем про то что его надо "делать" — тоже
Здравствуйте, Фаллопиева труба, Вы писали:
А>>Помогите новичку! А>>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?
ФТ>Деструкторы могут не вызываться при создании массива с помощью оператора new[] и удалении его(массива) с помощью оператора delete.
Это называется "сделал new[] и не сделал delete[]"
Не считая того, что new[]/delete — это UB. (И одним из возможных эффектов этого поведения будет невызов деструкторов).
И кстати, мы говорим про new[] expression или про operator new[] ?