+16
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
#include <iostream>
using namespace std;
struct T{int a;T(){cout<<"T"<<this<<endl;}~T(){cout<<"~T"<<this<<endl;}};
struct D:public T{int b;D(){cout<<"D"<<this<<endl;}~D(){cout<<"~D"<<this<<endl;}};
int main() {
T* a = new D[2];
cout<<"mission failure"<<endl;
delete[] a;
return 0;
}
Писал тест специально для Тараса:
Виртуальный деструктор в базовых классах нужен:
*Для вызова деструкторов всех потомков. Иногда это не нужно, тк поля структуры тривиальны. Согласен с Тарасом.
*Для правильного выбора перегруженного оператора delete. Создал одним менеджером памяти, а удалил в другой - это плохо. Но также бывает редко и только в специфичных проектах.
Но вот то, что демонстрируется в этом примере - думаю чего-нибудь такого создатели той библиотеки, что ковырял Тарас, и опасались.
Не просто было вызван деструктор только для предков, забыв о деструкторах потомков, но и:
*Деструктор предков был вызван для this не по тем адресам, где расположены объекты.
Не удивлюсь, если:
*В некоторых кулхацкерских реализациях менеджеров памяти будет удален буфер меньшего размера и куча попортится или оставшаяся не удаленная часть массива в куче просто утекет.
http://liveworkspace.org/code/2X3MR0$8
Запостил:
LispGovno,
22 Декабря 2012
Если хочется извращений для души, пожалуйста, миллион способов их получить. Напишите объектро-ориентированный Malbolge и занимайтесь содомией до смерти. Но если хочется достигнуть цели, они не нужны.
Сам слез с крестов 3 года назад, ни о чем не жалею.
Быдлосишарпик - хороший язык для своих задач.
Его создатели собрались и сказали, давайте возьмем С++ и выкинем из него все детские грабли. Пусть он будет медленным и домохозяечным, зато программисты не отобьют себе яйца с первого же шага.
проверочное слово борьщ
ps: Метопрагромирванье забыл упомянуть.
Я его не особо использую, ибо
1) я пишу код, который будут читать другие люди, скорее всего, не особо искушённые в мета-
2) нет пока особой потребности, а метапрограммирование ради метапрограммирования мне неинтересно
http://xkcd.ru/i/303_v1.png
Ну или хотя бы на русском назовите.
http://liveworkspace.org/code/lGIIZ$21
, то не скомпилируется, хотя "лишний" конструктор от int максимально спрятан и вроде влиять не должен.
User-defined conversions are applied only where they are unambiguous (10.2, 12.3.2). Conversions obey the access control rules (clause 11). Access control is applied after ambiguity resolution (3.4).
P.S. А иксплисит тут вообще не в тему, ты же явно юзаешь конструктор.
Но зачем?
> не сказать, что получаю баттхёрт или наступаю на грабли
Ну и на кой она нужна? По сути сей язык изобрели-то для тех кто обезьян, которые не осилили (и не смогут осилить) плюсы.
В плюсиках и перегрузка операторов, и лямбды.
А в жабе что? Мегабайты xmlя и паттерны?
Ведь удобней бриться острой бритвой, чем тупой жабой. Просто надо быть осмотрительным.
Жаба просто не стала быдловской из-за неудобной либы и выского порога вхождения.
Для крестов был быдлер, для пхп денвер, для шарпа - студия.
Потом Common Lisp, Objective-C
Сейчас вот опять приходится к С++ возращаться, точнее к особо извращенной гибродной его форме Objective-C++, потому что некоторые библиотеки чисто на С++, их надо как-то присовокуплять к остальному коду.
Я не утвраждаю, что C++ говно, просто меня расстраивает неистовое стремление некоторых превратить его богатый набор возможностей в говенное кровавое месиво. И эта тенденция последнее время стала повальной.
Что это?
Че-нить типа
Или:
И прочий маразм :)
Ага, а T и D разного размера, оно хоть иногда нормально работает, a[1] корректно определяется?
http://liveworkspace.org/code/code/2X3MR0$9
виртуальный деструктор добавить, то нормально удаляется.
P.S. Забавно, но в gcc delete[] вызывает деструкторы от конца массива к началу, видимо так цикл получается оптимальней, а в стандарте все равно написано, что вызовутся все, но порядок не указан. Из-за этой фишки на данном примере не получится увидеть "правильно" вызванный деструктор.