+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
LispGovno 22.12.2012 22:44 # −2
Dummy00001 22.12.2012 22:47 # −2
tirinox 23.12.2012 02:02 # −4
LispGovno 23.12.2012 11:28 # +1
tirinox 23.12.2012 13:28 # +6
Если хочется извращений для души, пожалуйста, миллион способов их получить. Напишите объектро-ориентированный Malbolge и занимайтесь содомией до смерти. Но если хочется достигнуть цели, они не нужны.
Сам слез с крестов 3 года назад, ни о чем не жалею.
TarasB 23.12.2012 13:41 # +2
LispGovno 23.12.2012 13:46 # −5
tirinox 23.12.2012 14:04 # −2
Быдлосишарпик - хороший язык для своих задач.
Его создатели собрались и сказали, давайте возьмем С++ и выкинем из него все детские грабли. Пусть он будет медленным и домохозяечным, зато программисты не отобьют себе яйца с первого же шага.
TarasB 23.12.2012 14:13 # −3
LispGovno 23.12.2012 14:35 # 0
TarasB 23.12.2012 15:13 # +2
LispGovno 23.12.2012 15:18 # +1
LispGovno 23.12.2012 16:55 # +2
проверочное слово борьщ
roman-kashitsyn 23.12.2012 21:37 # +3
LispGovno 23.12.2012 22:28 # 0
ps: Метопрагромирванье забыл упомянуть.
roman-kashitsyn 23.12.2012 22:50 # +1
Я его не особо использую, ибо
1) я пишу код, который будут читать другие люди, скорее всего, не особо искушённые в мета-
2) нет пока особой потребности, а метапрограммирование ради метапрограммирования мне неинтересно
LispGovno 23.12.2012 22:55 # +4
http://xkcd.ru/i/303_v1.png
defecate-plusplus 23.12.2012 22:54 # +4
LispGovno 24.12.2012 06:54 # 0
roman-kashitsyn 24.12.2012 07:53 # +5
TarasB 24.12.2012 08:33 # +6
LispGovno 24.12.2012 08:48 # +2
LispGovno 24.12.2012 17:17 # 0
LispGovno 24.12.2012 18:27 # 0
Ну или хотя бы на русском назовите.
bormand 24.12.2012 18:46 # +1
LispGovno 24.12.2012 18:56 # 0
http://liveworkspace.org/code/lGIIZ$21
, то не скомпилируется, хотя "лишний" конструктор от int максимально спрятан и вроде влиять не должен.
bormand 24.12.2012 19:20 # +3
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).
defecate-plusplus 24.12.2012 19:24 # +2
LispGovno 24.12.2012 19:36 # −1
bormand 24.12.2012 19:57 # 0
P.S. А иксплисит тут вообще не в тему, ты же явно юзаешь конструктор.
3.14159265 24.12.2012 15:58 # +4
Но зачем?
> не сказать, что получаю баттхёрт или наступаю на грабли
Ну и на кой она нужна? По сути сей язык изобрели-то для тех кто обезьян, которые не осилили (и не смогут осилить) плюсы.
В плюсиках и перегрузка операторов, и лямбды.
А в жабе что? Мегабайты xmlя и паттерны?
Ведь удобней бриться острой бритвой, чем тупой жабой. Просто надо быть осмотрительным.
LispGovno 24.12.2012 17:10 # +2
3.14159265 24.12.2012 17:22 # +3
Жаба просто не стала быдловской из-за неудобной либы и выского порога вхождения.
Для крестов был быдлер, для пхп денвер, для шарпа - студия.
LispGovno 24.12.2012 18:18 # 0
tirinox 23.12.2012 13:58 # +4
Потом Common Lisp, Objective-C
Сейчас вот опять приходится к С++ возращаться, точнее к особо извращенной гибродной его форме Objective-C++, потому что некоторые библиотеки чисто на С++, их надо как-то присовокуплять к остальному коду.
Я не утвраждаю, что C++ говно, просто меня расстраивает неистовое стремление некоторых превратить его богатый набор возможностей в говенное кровавое месиво. И эта тенденция последнее время стала повальной.
TarasB 23.12.2012 14:13 # +4
Что это?
LispGovno 23.12.2012 14:34 # +1
tirinox 23.12.2012 14:35 # +4
Че-нить типа
Или:
И прочий маразм :)
LispGovno 23.12.2012 14:38 # +1
tirinox 23.12.2012 14:55 # +2
TarasB 23.12.2012 12:24 # +2
Ага, а T и D разного размера, оно хоть иногда нормально работает, a[1] корректно определяется?
bormand 23.12.2012 12:46 # +1
LispGovno 23.12.2012 12:46 # −1
http://liveworkspace.org/code/code/2X3MR0$9
виртуальный деструктор добавить, то нормально удаляется.
bormand 23.12.2012 12:49 # +1
TarasB 23.12.2012 12:51 # +1
bormand 23.12.2012 12:54 # +2
P.S. Забавно, но в gcc delete[] вызывает деструкторы от конца массива к началу, видимо так цикл получается оптимальней, а в стандарте все равно написано, что вызовутся все, но порядок не указан. Из-за этой фишки на данном примере не получится увидеть "правильно" вызванный деструктор.
bormand 23.12.2012 12:35 # +4
TarasB 23.12.2012 12:51 # +1