Re[4]: Разрушение компа прежде, чем будет разрушен объект, покатит? ;)
От: sts  
Дата: 25.01.13 17:20
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, sts, Вы писали:


А>>>>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?


E>>>на пример, если объёкт создали на компе, установленном на борут ГЧ, достигшей цели


sts>>так ведь и delete не успели сделатьт, так что это не в счет

E>Ты ТС или просто рассуждаешь?
E>Я так понял, что ТС спросил, когда может так получится, что у созхданного С++ объекта не будет вызван деструктор. при этом случай с забытым delete, он считал тривиальным и просил на него не отвлекаться. на этот вопрос я и ответил...

брутально, можно было никого не взрывать, а просто комп из розетки выдернуть
Re[5]: А когда может не вызываться деструктор?
От: sts  
Дата: 25.01.13 18:34
Оценка: -1
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, sts, Вы писали:


EP>>>

EP>>>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
EP>>>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.

EP>>>Технически никому он ничего не должен, особенно если:
EP>>>1. он protected
sts>>тогда не получится "удалять через указатель на базовый класс"

A>не подменяйте тему.

A>в цитате написано не "удалять", а разрушать.
A>это разные вещи.

это уже демагогия
Re[7]: А когда может не вызываться деструктор?
От: sts  
Дата: 25.01.13 18:36
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, vitcpp, Вы писали:


V>>>>Почему чушь? Обоснуйте.

A>>>http://rsdn.ru/forum/cpp/5044673.1
Автор: Abyx
Дата: 25.01.13


V>>Это все понятно. Полагаю, вы слишком формально подходите к статье, и вас смутило слово 'должен'. Но по сути, описано хорошее правило делать деструктор виртуальным в случае полиморфных типов. Можно использовать обычный деструктор, если вы точно уверены, как именно ваша иерархия классов будет использоваться или в целях оптимизации.


A>хорошее правило — это 'не делать того что не нужно делать' или 'делать только то что нужно делать'.

A>если виртуальный деструктор не нужен, то незачем его делать.

в данном случае это надо делать (делать деструктор виртуальным), т.к. большинство разработчиков этого ожидают
Re[7]: А когда может не вызываться деструктор?
От: sts  
Дата: 25.01.13 18:39
Оценка:
Здравствуйте, 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 удаления через указатель на базовый класс — там базовый класс кастуется к нужному прежде чем удалить
Re[7]: А когда может не вызываться деструктор?
От: sts  
Дата: 25.01.13 18:40
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, rg45, Вы писали:


A>>>>>

A>>>>>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>>>>>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.


R>>Да, к сожалению, авторы статьи не дали четкого определения, что они понимают под полиморфным классом. Из общего контекста статьи можно догадаться, что они вкладывали в это понятие более широкий смысл — класс, объекты которого могут не только использоваться, но и удаляться через указатель базового класса (именно этому вопросу в статье уделено много внимания). Конечно же, это недочет, неточность формулировки, но еще не повод разбрасываться ярлыками типа "чушь" и "говносайт".


A>вот поэтому статья и говно, раз там написана чушь наподобие "раз полиморфный — значит ДОЛЖЕН быть виртуальный деструктор".

A>про весь сайт я может погорячился, хотя раз там есть статья такого качества — наверное и весь сайт такой.

A>у термина "полиморфный (класс)" есть вполне конкретное определение.

A>то что на это определение наложено ограничение, что объекты потомков такого класса будут удаляться через delete — это называется "более узкий смысл".

ожидается, что деструктор будет полиморфным
так же как ожидается, что из него не будет выкинуто исключение
Re: А когда может не вызываться деструктор?
От: Фаллопиева труба  
Дата: 25.01.13 19:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Помогите новичку!

А>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?

Деструкторы могут не вызываться при создании массива с помощью оператора new[] и удалении его(массива) с помощью оператора delete.

Пример:

class A
{
public:
~A(){}
};

int main()
{
A* a = new A[100500];
...
delete a; // should be delete[] a;
}
array destructor
Re[8]: А когда может не вызываться деструктор?
От: Abyx Россия  
Дата: 25.01.13 20:13
Оценка:
Здравствуйте, sts, Вы писали:

V>>>Это все понятно. Полагаю, вы слишком формально подходите к статье, и вас смутило слово 'должен'. Но по сути, описано хорошее правило делать деструктор виртуальным в случае полиморфных типов. Можно использовать обычный деструктор, если вы точно уверены, как именно ваша иерархия классов будет использоваться или в целях оптимизации.


A>>хорошее правило — это 'не делать того что не нужно делать' или 'делать только то что нужно делать'.

A>>если виртуальный деструктор не нужен, то незачем его делать.

sts>в данном случае это надо делать (делать деструктор виртуальным), т.к. большинство разработчиков этого ожидают


большинство разработчиков (С++) не знают С++, не знают стандартную библиотеку и называет шаблоны магией, ну и что?
не надо равняться на таких людей.
In Zen We Trust
Re[8]: А когда может не вызываться деструктор?
От: Abyx Россия  
Дата: 25.01.13 20:14
Оценка: -1
Здравствуйте, sts, Вы писали:

A>>у термина "полиморфный (класс)" есть вполне конкретное определение.

A>>то что на это определение наложено ограничение, что объекты потомков такого класса будут удаляться через delete — это называется "более узкий смысл".

sts>ожидается, что деструктор будет полиморфным

sts>так же как ожидается, что из него не будет выкинуто исключение

*тобой* ожидается? да кого это волнует
In Zen We Trust
Re[5]: Разрушение компа прежде, чем будет разрушен объект, покатит? ;)
От: Erop Россия  
Дата: 25.01.13 21:01
Оценка:
Здравствуйте, sts, Вы писали:

sts>брутально, можно было никого не взрывать, а просто комп из розетки выдернуть

Это какой-то форс-мажор, на который не понятно, надо ли рассчитывать вообще при проектировании ПО для этого компа.

А вот на то, что ГЧ поразит таки цель, авторам её ПО рассчитывать стоит...

Впрочем, если тебя пугает брутальность, есть более мягкий вариант. Кроме БЧ есть много других устройств, в которых останов ПО не предусмотрен. То есть раз запущенное оно крутится на устройстве до конца его функционирования, либо до аппаратного сбоя/холодного рестарта. Там вызов дестукторов статических объектов обычно тоже не прежусмотрен,..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: А когда может не вызываться деструктор?
От: sts  
Дата: 26.01.13 11:07
Оценка:
Здравствуйте, sts, Вы писали:

A>>лечится включением предупреждений в компиляторе.


sts>что лечится ?

sts>если включить предупреждения, то деструктор вызовется ?
sts>не верю

с чем ты тут не согласен-то ?
Re[9]: А когда может не вызываться деструктор?
От: doarn Россия  
Дата: 26.01.13 13:33
Оценка:
Здравствуйте, Abyx, Вы писали:

sts>>ожидается, что деструктор будет полиморфным

sts>>так же как ожидается, что из него не будет выкинуто исключение

A>*тобой* ожидается? да кого это волнует


А какой профит делать публичный невиртуальный деструктор если vtbl уже есть в классе?
Я могу представить пару очень особенных случаев, но даже про них не уверен что оно того стоит.
Re[10]: А когда может не вызываться деструктор?
От: Abyx Россия  
Дата: 26.01.13 15:26
Оценка: -1
Здравствуйте, doarn, Вы писали:

D>Здравствуйте, Abyx, Вы писали:


sts>>>ожидается, что деструктор будет полиморфным

sts>>>так же как ожидается, что из него не будет выкинуто исключение

A>>*тобой* ожидается? да кого это волнует


D>А какой профит делать публичный невиртуальный деструктор если vtbl уже есть в классе?

D>Я могу представить пару очень особенных случаев, но даже про них не уверен что оно того стоит.

про "публичный" никто не говорил.
впрочем про то что его надо "делать" — тоже
In Zen We Trust
Re[2]: А когда может не вызываться деструктор?
От: Кодт Россия  
Дата: 26.01.13 18:55
Оценка:
Здравствуйте, Фаллопиева труба, Вы писали:

А>>Помогите новичку!

А>>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?

ФТ>Деструкторы могут не вызываться при создании массива с помощью оператора new[] и удалении его(массива) с помощью оператора delete.


Это называется "сделал new[] и не сделал delete[]"
Не считая того, что new[]/delete — это UB. (И одним из возможных эффектов этого поведения будет невызов деструкторов).

И кстати, мы говорим про new[] expression или про operator new[] ?
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.