#1 23.01.08 20:03
[С++] жжот!
Предыстория (кто боится многобукаф можно не читать):
Сегодня зашёл разговор со знакомым программистом о C++, а именно о выделение/удалении в нём памяти командами new/delete. А именно, о том как помечаются границы выделенной памяти, где хранится информация о количестве выделенной памяти и всё такое. И на основании всего этого, нас привлёк синтаксис оператора удаления динамического массива: delete[] myArray; И конечно же, пытливый ум не мог обойти вопрос о том что же можно написать в этих скобочках [] и как себя будет вести программа?
Собственно прикол:
Издевались над строчкой "delete[] myArray;" в деструкторе класса.
Всё ниже перечисленное отлично компилится Visual Studio 2005:
delete[currentSize] myArray; // всё работает как обычно!
delete[currentSize/2] myArray; // никаких изменений.
delete[currentSize*2] myArray; // никаких изменений.
delete[0] myArray; // никаких изменений.
delete[4294967296] myArray; // никаких изменений.
delete[-1] myArray; // никаких изменений.
delete[*this] myArray; // тоже всё прекрасно!
и т.д.
но окончательно убило следующее:
delete[cout << "C++ - must die!" << endl] myArray;
мало того что всё правильно удаляется, так ещё и пишет C++ - must die!
Offline
#7 23.01.08 21:44
Re: [С++] жжот!
antonoff, я точно не знаю, но у меня есть подозрение, что в старых версиях компилятора, то что написано в этих скобочках хоть как-то использовалось для удаления памяти.
А вообще логично, что выполняется, то что написано в скобках, хоть это выражение никуда и не идёт, но вычислить-то компилятор его обязан. Более того, это выполняется перед delete, т.е. всё равно что написать так:
Код: c++:
cout << "C++ - must die!" << endl; delete[] myArray;
Offline
#10 25.01.08 12:23
Re: [С++] жжот!
AntiGen написал(а):
ttttttttt, пробовал, не канает =(
это проверка того, а есть ли жизнь после смерти))
с внешней стороны от содержимого скобок находится контрольный delete[] myArray, который ясное дело не канает, ибо не с чем канать уже)
а в тему [С++] жжот! - гораздо смешнее было, когда у меня объект класса убивал себя сам, а потом пытался еще что-то сделать))
компилятор естественно это дело пропустил, так как с его точки зрения было все корректно, а за рантайм он не в ответе)
мне тогда долго пришлось прогонять алгоритм в уме до тех пор, пока до меня не дошло..
Offline
#11 25.01.08 13:46
Re: [С++] жжот!
ttttttttt написал(а):
объект класса убивал себя сам
гыыыыыы =) это вообще возможно? delete this что ли? мне всегда казалось, что компилятор такого не позволит... хотя после увиденного практически нет сомнений, что в C++ возможно всё =)))
ttttttttt написал(а):
прогонять алгоритм в уме
для этого есть дебаггер, в нём удобней ;)
Offline
#12 25.01.08 14:08
Re: [С++] жжот!
AntiGen написал(а):
это вообще возможно? delete this что ли?
поверь мне - возможно) не delete this, но по сути то же самое - объект освободил память, занимаемую собой)
а насчет дэлита - я им не пользуюсь, ибо если пишешь под винду, то нафига пользоваться каким-то new/delete, когда есть выньапишные функции для работы с памятью)
Offline
#13 25.01.08 20:29
#14 26.01.08 03:07
Re: [С++] жжот!
ttttttttt написал(а):
мне тогда долго пришлось прогонять алгоритм в уме до тех пор, пока до меня не дошло..
еще поди ка и итерации все подсчитал? О_о? )
Offline
#15 27.01.08 01:24
#16 27.01.08 06:47
#17 27.01.08 16:13
#18 27.01.08 18:41
Re: [С++] жжот!
Жесть... мальчики, вы меня пугаете :( Жжёте тут вы и ваш компилятор, а не c++. Как писал уже Matrim, в нормальном компиляторе ( к примеру gcc ) такого бага нет. Не позорьте свой факультет ;)
P.S.
Кстати, вы за ANSI C++ вникали? Там по этому поводу что-нибудь говориться?
Исправлено efferson (27.01.08 18:42)
Offline
#19 27.01.08 18:53
Re: [С++] жжот!
Багом это кажется только сначала, потому что непривычно, я же вроде выше написал, что
AntiGen написал(а):
А вообще логично, что выполняется, то что написано в скобках, хоть это выражение никуда и не идёт, но вычислить-то компилятор его обязан.
efferson написал(а):
Не позорьте свой факультет ;)
Тебе смешно?
мне тоже было смешно, когда я делал лабы, для студентов вашего, efferson, факультета. Я понимаю, что для многих, Hostel - это способ самовыражения, эдак вечерком после тяжелого дня за стаканчиком пива так приятно что-нибудь или кого-нибудь обосрать, но всё-таки давайте не будем здесь мериться письками у кого что круче и кто что позорит, окей?
Offline
#20 27.01.08 18:59
Re: [С++] жжот!
Да не горячись ты так :)))
AntiGen написал(а):
мне тоже было смешно, когда я делал лабы, для студентов вашего, efferson, факультета
Дебилов везде хватает - с этим я не спорю :)
AntiGen написал(а):
давайте не будем здесь мериться письками
Где моя линейка??!! ;)
P.S.
А если серьёзно - может кто знает, что в ANSI по этому поводу написано? Сам бы глянул, но инета почти уже не осталось... :(
Offline
#21 29.01.08 01:47
Re: [С++] жжот!
Я написал(а):
мДА....
efferson написал(а):
Не позорьте свой факультет
позор тем, кто не испробует любой баг, и не придумает как его использовать)
а про факультет мимо, ибо на моем факультете все ограничивается семестром
изучения СРР, и мне это изучение мало что дало...
Offline
#22 29.01.08 09:28
Re: [С++] жжот!
ttttttttt, Во первых, кто сказал, что это баг?
Во вторых, что в этом интересного? Почему никого не волнуют конструкции вида: arr[++i] = 1 ?
Ясно что arr[cout << 10] = 1 откомпилять не получится, если конечно не переопределить оператор [] для класса, которому принадлежит arr.
Offline
#23 29.01.08 16:43
Re: [С++] жжот!
Я написал(а):
ttttttttt, Во первых, кто сказал, что это баг?
efferson написал(а):
Как писал уже Matrim, в нормальном компиляторе ( к примеру gcc ) такого бага нет.
я такого не говорил, получается что ты сказал
Я написал(а):
Почему никого не волнуют конструкции вида: arr[++i] = 1 ?
меня волновали в свое время
Я написал(а):
что в этом интересного
любая конструкция языка Си\Си++ заслуживает интереса до тех пор, пока не станет использоваться по назначению на уровне автоматизма
Offline
#24 31.01.08 12:35
#25 02.02.08 21:24
Re: [С++] жжот!
баги... удалил сам себя... )))
я тоже в свое время долго трахался со своевременным удалением в проекте...
потом перешел на C#.
а теперь перешел на DSP и понял, что все эти баги - фуфел ))))
Ибо когда глючащая и отваливаюшаяся и сама по себе железка перестает работать с отладчиком только потому, что Сишный компилятор выделил слишком много памяти - вот это баг так баг получается )))
заметьте, не программа не работает... Не работает процессор вместе с отладочной платой :)
Сначала пытаешься выяснить - толи плата тупо глючит, толи таки ты прогу кривую написал, а потом уже баг в программе ищешь...
хотя это по началу нарена такая хня. потом нарена привыкну.
P.S. это так... чисто офф. крики души, можно сказать )))
Offline
#26 03.02.08 13:05
#27 10.02.08 10:53
#28 13.02.08 02:54
#29 17.02.08 23:51
#30 18.02.08 00:51
Re: [С++] жжот!
asp написал(а):
Простите меня отставшего от жизни, а чем сейчас принято пользоваться?
ttttttttt написал(а):
выньапишные функции для работы с памятью
это у меня принято, а как у остальных - думаю зависит от того, кто под что и на чем пишет)
Исправлено ttttttttt (18.02.08 00:53)
Offline

