Официальный сайт студ.городка НГТУ
Программирование и БД » [С++] жжот! 

#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

#2  23.01.08 21:16

Re: [С++] жжот!

Предлагаю развить эту идею дальше и писать куски программы между этих самых квадратных скобок, раз так все работает)))

Offline

#3  23.01.08 21:23

Re: [С++] жжот!

ага, а потом преподам сдавать. Пусть офигеют от того как это вообще работает!

Offline

#4  23.01.08 21:27

Re: [С++] жжот!

нам Макаревич Л.Г. говорила кстати, что в этих скобочках писать можно все что угодно)
удивленная поточка переспросила :"прям всё??".
и Л.Г. уверенно сказала : "ДА! хотите - попробуйте!"

Offline

#5  23.01.08 21:30

Re: [С++] жжот!

antonoff, а то что это ещё исполняется она вам не говорила???

Offline

#6  23.01.08 21:34

Re: [С++] жжот!

AntiGen, она сказала нам "ну попробуйте!"
и все дружненько про это забыли, поверили наслово

Offline

#7  23.01.08 21:44

Re: [С++] жжот!

antonoff, я точно не знаю, но у меня есть подозрение, что в старых версиях компилятора, то что написано в этих скобочках хоть как-то использовалось для удаления памяти.

А вообще логично, что выполняется, то что написано в скобках, хоть это выражение никуда и не идёт, но вычислить-то компилятор его обязан. Более того, это выполняется перед delete, т.е. всё равно что написать так:

Код: c++:

cout << "C++ - must die!" << endl;
delete[] myArray;

Offline

#8  25.01.08 06:07

Re: [С++] жжот!

AntiGen написал(а):

Собственно прикол:

а ты пробовал написать :
  delete[ delete[] myArray] myArray;
?))

а вообще - кто-то еще пользуется конструкцией new/delete?

Исправлено ttttttttt (25.01.08 06:12)

Offline

#9  25.01.08 09:22

Re: [С++] жжот!

ttttttttt, пробовал, не канает =(

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

Re: [С++] жжот!

в gсс не работает

Offline

#14  26.01.08 03:07

Re: [С++] жжот!

ttttttttt написал(а):

мне тогда долго пришлось прогонять алгоритм в уме до тех пор, пока до меня не дошло..

еще поди ка и итерации все подсчитал? О_о? )

Offline

#15  27.01.08 01:24

Re: [С++] жжот!

Один решил всё таки попробовать, а все дружно забыли...
AntiGen, молодец, но только почему ты после сессии вспомнил. Как дела с предметом "МФЦ"?)))

Offline

#16  27.01.08 06:47

Re: [С++] жжот!

<Андрюха>, я не вспомнил, я этого не знал и наткнулся случайно. Я не с АМ и Макаревич у меня ничего не вела, а вообще слышал о ней не лестные слухи.

Offline

#17  27.01.08 16:13

Я
Профиль

Re: [С++] жжот!

мДА....

Offline

#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

Я
Профиль

Re: [С++] жжот!

ttttttttt написал(а):

я такого не говорил, получается что ты сказал

Значит я сделал не правильный вывод из слов:

ttttttttt написал(а):

позор тем, кто не испробует любой баг, и не придумает как его использовать)

Offline

#25  02.02.08 21:24

Re: [С++] жжот!

баги... удалил сам себя... )))
я тоже в свое время долго трахался со своевременным удалением в проекте...
потом перешел на C#.

а теперь перешел на DSP и понял, что все эти баги - фуфел ))))

Ибо когда глючащая и отваливаюшаяся и сама по себе железка перестает работать с отладчиком только потому, что Сишный компилятор выделил слишком много памяти - вот это баг так баг получается )))
заметьте, не программа не работает... Не работает процессор вместе с отладочной платой :)

Сначала пытаешься выяснить - толи плата тупо глючит, толи таки ты прогу кривую написал, а потом уже баг в программе ищешь...
хотя это по началу нарена такая хня. потом нарена привыкну.

P.S. это так... чисто офф. крики души, можно сказать )))

Offline

#26  03.02.08 13:05

Я
Профиль

Re: [С++] жжот!

Andron_, Потом ты выучишь полный набор граблей и научишься их обходить )
З.Ы. Пиши свой менеджер памяи )

Offline

#27  10.02.08 10:53

asp
Профиль

Re: [С++] жжот!

ttttttttt написал(а):

а вообще - кто-то еще пользуется конструкцией new/delete?

Простите меня отставшего от жизни, а чем сейчас принято пользоваться?

Offline

#28  13.02.08 02:54

Maq
Профиль

Re: [С++] жжот!

asp написал(а):

Простите меня отставшего от жизни, а чем сейчас принято пользоваться?

Наверное классами которые делают это за них :))

Offline

#29  17.02.08 23:51

asp
Профиль

Re: [С++] жжот!

Maq, а в класах new/delete не бывает??

Offline

#30  18.02.08 00:51

Re: [С++] жжот!

asp написал(а):

Простите меня отставшего от жизни, а чем сейчас принято пользоваться?

ttttttttt написал(а):

выньапишные функции для работы с памятью

это у меня принято, а как у остальных - думаю зависит от того, кто под что и на чем пишет)

Исправлено ttttttttt (18.02.08 00:53)

Offline

#31  21.02.08 01:09

Maq
Профиль

Re: [С++] жжот!

ttttttttt, череп не жмет? ;)

Offline

#32  21.02.08 16:27

Re: [С++] жжот!

Maq, а я что-то умное ляпнул чтоли?)

Offline

Программирование и БД » [С++] жжот! 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.044 сек.
Выполнено 14 запросов.