![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ip127001 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 24.11.2006 Где: Omsk Репутация: -2 Всего: -1 |
здрасти...объясните плиз
создаем что-то типа буфера char buf[100];-100 чаров потом из этой памяти берем определенное число char * p=new (buf)char[120]-чаров почему компилятор не выдает ошибки...разве тут не будет переполнения.. даже если for'ом заполнить область на которую ссылается p...ошибки тоже не возникает... в чем прикол...мож я что недопонял :qstn --------------------
aqua currit et debere currere ut currere solebat |
|||
|
||||
| SerpentVV |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 27.11.2006 Где: Астрахань Репутация: 1 Всего: 1 |
С++ не проверяет границы массивов при работе с указателями...
Компилятор не в состоянии отследить значение компилятора во время выполнения, поэтому считает, что программер знает, что делает... |
|||
|
||||
| ip127001 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 24.11.2006 Где: Omsk Репутация: -2 Всего: -1 |
от оно как..лан спасибо вопрос исчерпан... Добавлено @ 17:28 ух ты какой кавардак будет если напортачить... --------------------
aqua currit et debere currere ut currere solebat |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
Не хочешь сам контролировать доступ к памяти - используй managed технологии. Такие как Java и .NET |
|||
|
||||
| ip127001 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 24.11.2006 Где: Omsk Репутация: -2 Всего: -1 |
нет уж...я привык думать сам! --------------------
aqua currit et debere currere ut currere solebat |
|||
|
||||
| SerpentVV |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 27.11.2006 Где: Астрахань Репутация: 1 Всего: 1 |
Вместо массивов используй стандартный контейнер vector из STL. Тогда не придется следить за индексами...
Там еще и list eсть и stack и queue... |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Есть кстати куча всяких коде-анализеров, которые подобные ошибки находят. Для большого сишного кода - достаточно приятно (для плюсов - спасают готовые контейнеры, смарт-поинтеры и пр.).
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Если повезёт - может пролететь
|
|||
|
||||
| Rockie |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
у меня в VS2005 выдает, C2660
даже если напишешь
то это как "повезет-не повезет" -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
В VS2005 деьаг версия успешно компилится и успешно вылетает. Самое интересное, что релиз тупо выводит три восклицтаельных знака |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
И как такое смогло скомпилиться? Я что-то не понял... Блин! Я что, перестал русский язык знать?! Что не пост - то ошибка в родном языке! Иногда править ленюсь, а потом стыдно! Наверное это программерская болезнь... Это сообщение отредактировал(а) Anikmar - 7.2.2007, 20:50 |
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Откуда взялся такой синтаксис ? |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
threef, я привел цитату Любителя - выше моего поста.... Он написал, что компилится нормально, а я удивился - как такое может скомпилиться?
|
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
а я из loopback-а, с первого поста.
Компилится, работает остается предложить сделать delete [] p Пойду за мылом и веревкой. |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Тьфу, это я уже запутался... char * p=new (buf)char[120] Эта конструкция ничего не нарушает. Мы приводим указатель на char к указателю на char - так как buf в чистом виде является именно этим. В языке Си имя массива без скобок является указателем на начало массива. так что char *b char bb[10] b и bb эквивалентны. |
|||
|
||||
| ip127001 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 24.11.2006 Где: Omsk Репутация: -2 Всего: -1 |
это все ясно....но не потеме..
не говори сам в шоке.. там кто-то говорил что на VC ошибка при компиляции возникает см. пост 1 так на BC++ 6 голяк...даже не заикнулся хорошо я так для прикола решил проверить...теперь буду внимательно_ОЧЕНЬ_этим пользоваться... а то в проге лям такой допустишь, и до нового года искать ошибку будешь... --------------------
aqua currit et debere currere ut currere solebat |
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
ничего мы не приводим эта конструкция placement new называется с чего это вдруг? это разные типы и никакой эквиваленции быть не может другое дело, что компилятор неявно прииводит char[] к char* в некоторых случаях -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Может я неправильно выразился. Имя массива является указателем. Некоторое исключение составляет явное определение размера массива. Запись такого вида:
Нормально откомпилируется и будет работать без всяких вопросов. |
||||
|
|||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
| SerpentVV |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 27.11.2006 Где: Астрахань Репутация: 1 Всего: 1 |
1. Имя массива является конст антным указателем - этог только в С было... В С++ имя массива приводится к указателю в некоторых случаях... 2. Не советую использовать такие конструкции... Там не хватает как минимум new
Иначе можно нарваться... |
|||
|
||||
| Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Я специально поставил многоточие. Выделение памяти может осущестляться различными методами, совершенно необязательно оператором new (оставим правильность такого подхода с точки зрения общепринятых и рекомендуемых методов). Я именно про конструкцию:
Про константный я и не спорил, я говорил про использование имени массива. Использовать имя массива как указатель допустимо и никаких ошибок не вызовет. |
||||
|
|||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Anikmar, сорри в апострофах, конечно - писал быстро, ошибся чуток.
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Любитель, в 2003 вылетает и в release и в Debug
никаких тут как надо!! это константа, ее нельзя менять, так что билдер плохо сработал.. |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
vinter, почему константа? если написать const char *p = "ку-ку"; тогда константа...
Ща для интереса гляну в стандарт. Добавлено @ 00:36 Может плохо смотрел, но в черновике стандарта ни слова не нашел про константу.... |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
стандарт в глаза не видел
но верю Струструпу char *p = "111"; , и const char *p = "111"; одно и тоже |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Сам техт "!!!" - это константа (присваивается же только указатель), она хранится где-то в памяти, и при попытке изменить её скорее всего программа вылетит. -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Да почему? Объясните, мне, дураку? Во многих старых учебниках по Си давалось предупреждение: "С осторожностью изменяйте текстовые строки - при установке опции компилятора "соединять одинаковые строки" вы можете получить нежелательные результаты" То, что так делать не надо - я даже спорить не буду, но то, что стандарт это не запрещает - это факт.
Это сообщение отредактировал(а) Anikmar - 9.2.2007, 01:19 |
||||
|
|||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Теоретически константы можно изменять, это всего лишь фича языка, да и в стандарте имхо точно не описано что будет если изменить константу через каст или указатель.
Но, каждый компилятор реализует и оптимирует их по-разному (может например расположить их где-нибудь в памяти, куда нет доступа на запись), так что результат зависит от фазы луны, положения звёзд и некоторых других общеизвестных факторов. -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Лично я на практике не встречал компилятора, который бы запретил такие действия или сделал их неправильно. Возможно теперь буду знать один - студию. Я начинал с турбо си, и в одном из учебников даже разбирался код, меняющий строку (не помню для чего, помню, что экономил память). ИМХО Такие действия допустимы в плане ненарушения стандарта, но бессмыслены во всех остальных планах. |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
gcc 4.1.1 тоже вылетает
ЗЫ. но не всегда, только без оптимизации, с оптимизацией выводит оба раза "!!!" Это сообщение отредактировал(а) nickless - 9.2.2007, 01:58 -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
| ip127001 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 24.11.2006 Где: Omsk Репутация: -2 Всего: -1 |
а с какой стати int *p=0; const int *p=0; одинаковыми стали...первый раз такое слышу!!!? Добавлено @ 11:26 они интерпритируются по разному... Добавлено @ 11:32
char *p="!!!"; const char *p1="!!!"; -----------------------это разные вещи --------------------
aqua currit et debere currere ut currere solebat |
||||
|
|||||
| vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
не перевирай мои слова, я это сказал только про char
почитай топик нормально, мы уже выяснили, что кроме чисто сишного турбо С, и борланда компиляторы не дают так делать, т.к считают это КОНСТАНТОЙ и из этого следует, что это идентичные вещи и никаких разных интерпретаций! |
||||
|
|||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Указатель никто и не пытался менять. Выясняли про собственно строку - в какую память он помещается. В стандарте написано, что инициализированный указатель на строку преобразовывается в неконстантный указатель, за исключением случая, когда он объявлен как массив. Компиляторы дают компилировать код, но вылетает сама программа при работе. Борланд ведет себя как положено в такой ситуации - строка меняется спокойно. Константный указатель или нет - это по барабану, никто не мешает сделать указатель неконстантным, присвоить ему значение проинициализированного строкой и попытаться поменять строку. В общем то спор о том, что можно или нет менять сами строки, зашитые в коде программы. В двух случаях происходит вылет или некорректная работа (на мой взгляд самая опасная ситуация - не можешь сделать, тогда уж вылетай с исключением, а не парь мозги программисту. А то получится на борланде работает, а в студии работает неправильно. Это некрасиво). А по поводу к чему преобразовывается - посмотрел используя type_id. Указатель вида char*p = "jsjsjsj"; и просто char *p имеют одинаковый тип (по крайней мере в борланде). |
|||
|
||||
| ip127001 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 24.11.2006 Где: Omsk Репутация: -2 Всего: -1 |
а причем тут область памяти....ты не путаешь указатель на константу с константным указателем? --------------------
aqua currit et debere currere ut currere solebat |
|||
|
||||
| MAKCim |
|
||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
есть разница между целочисленной константой и литеральной
если есть целочисленная константа
то компилятору не составит труда в качестве одного из операндов команды записать непосредственно 5, потому что это значение константы известно код
может выглядеть так
со строковыми литералами сложнее: непосредственно ее в команду никак не подставишь в отличие от целочисленной константы, поэтому она помещается в read-only секцию данных а в качестве операнда используется ее адрес в этой секции для GCC это будет так для кода
при этом при загрузке исполняемого файла и просмотре заголовков секций находится read-only секция и ее содержимое помещается в какую-то физическую страницу памяти, а в соответствующем этой странице элементе таблицы страниц сбрасывается флаг W, и дальнейшее обращение к ней с целью записи приводит к #PF А то, что какой-то Borland допускает изменение константной строки, то это говорит о "качестве" компилятора Это сообщение отредактировал(а) MAKCim - 10.2.2007, 11:03 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||
|
|||||||||||
| Любитель |
|
||||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
На мой взгяд следовало бы вообще запретить
только
|
||||
|
|||||
| Anikmar |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Стало быть так: если мы объявляем массив с инициализацией - его менять можно?
А если строку (которая тоже является массивом) то нельзя? Если я пишу так
Объясните где тут логика и чем строка отличается от массива?! Если я хочу инициализировать массив символов строкой - то в чем собственно проблема? Почему я потом не могу ее поменять?
Остаюсь при своем мнении - Борланд позволяет делать то, что не запрещено стандартом и он тут абсалютно прав. Добавлено @ 12:32 Делаю так - и все в порядке?
Мы говорим не о возможности изменить УКАЗАТЕЛЬ, а о возможности изменить область памяти, на которую он ссылается! |
||||||
|
|||||||
| MAKCim |
|
||||||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
строка - константна по своей природе и располагается в read-only области памяти (при выполнении программы) в этом случае мы просто получаем ее адрес и изменить не можем
а в этом создаем копию строки в стеке (read-write область памяти)
т. е грубо говоря компилятор генерирует приблизительно такой код
и дальше можем изменять любой элемент a конструкция же
вообще банально проста (даже нет никакой символьной строки - просто символы)
Это сообщение отредактировал(а) MAKCim - 10.2.2007, 13:09 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||||||
|
|||||||||||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
он не размещает константу (в данном случае символьную) в read-only секции данных - вот здесь его "хорошие" качества проявляются -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Это из чего следует? Я программист. Мне нужен строка флагов. Я могу ее создать двумя способами: char Options[] = "AAABBBCCDDEEFF"; или char *Options = "AAABBBCCDDEEFF"; Язык мне это разрешает, никакого запрета нет. Если абстрагироваться от мысли, что строка, это обязательно текстовая константа, выводимая на экран и рассматривать ее как инициализированный массив char - то все в порядке. Я не говорю, что так нужно делать. Я говорю о том, что теоретически можно. Но не нужно. И в некоторых учебниках по си (конечно, старых) укаазывалось, что данный код необходимо применять с осторожностью, особенно, если указана опция соединять одинаковые строки. Вот тут для меня загадка. И это, называется оптимизацией? Зачем две одинаковые строки в памяти? Резюме: мы такой баян растянули - что скоро остальные смеяться будут. Все равно каждый останется при своем мнении. Я остаюсь при таком: Делать так не стоит - так как непринято, противоречит хорошему тону программирования и т.п. Но к ошибке приводить это также не должно. |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
из того, что ты не можешь написать
равно как
это пример, естественно оптимизация возможна, но факт остается фактом: в одном случае мы используем указатель на строку в read-only секции, в другом - мы ее создаем (а уж с оптимизацией или нет - зависит от компилятора) должно это не тот случай, где возможны мнения -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Да ладно уж. Мнения возможны всегда, даже если они неправильбные - это просто ошибочные мнения. "bla-bla-bla"[0] - Такая конструкция запрещена синтаксисом самого языка. Что не запрещено стандартом должно быть разрешено. Никто не давал права трактовать стандарт по своему усмотрению. Я ничего не нашел в стандарте по поводу запрета изменения строки. Конечно, этот способ скорее пережиток Си и MSDOS, но ничего криминального я не вижу. Моя память - что хочу то и делаю! |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
сейчас открыл Страуструпа и убедился
тип "example" ~ const char[8] т. е Borland не прав - он обязан располагать "example" в read-only секции (конечно, если формат exutable файла их предусматривает... если нет - в топку такой формат)
Надеюсь, вопрос исчерпан? Это сообщение отредактировал(а) MAKCim - 10.2.2007, 13:41 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
А я с этим и не спорил - именно поэтому так нельзя: "example"[0] = 1; Пример: const int pInt[3] = {1,2,3}; int *t; // pInt[2] = 5; - Нельзя менять константный объект t = (int*)pInt; t[1] = 2; // Теперь можно - и ничего мы не нарушили (кроме здравого смысла) И ничего не вылетело |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
у меня вылетело, это раз во-вторых тут опять запись в read-only секцию Anikmar, каким компилятором пользуешься? Добавлено @ 13:47
да ладно
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
И так вылетит?
|
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Anikmar,
да на самом деле в этом случае GCC располагает массив в read-only секции, но уменьшает ESP, не нарушая тем самым семантику использования таких массивов в
или
мы получаем адрес массива в read-only секции и в итоге вылет т. е компилятор умен и дает нам пинок под зад вот это я понимаю - качество Это сообщение отредактировал(а) MAKCim - 10.2.2007, 13:59 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
а у меня(VS 2003) нет, да и с чего это оно должно вылететь, когда const снят?? |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
какое качество?? я сознательно снимаю константность!!! это противоречит свободе! |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
const_cast<> можно использовать для псевдоконстантных переменных т. е
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
MAKCim, первый раз такое слышу, в Страуструпе не нашел(толстая книга очень
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Зашел на сайт страуструпа. Тоже такого не нашел Добавлено @ 14:18
Это говорит о низком качестве поддержки стандарта. Разработчики не парились - и просто запретили. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Да, на VC++ 2005 такое катит
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
скорее наоборот ибо const_cast<> лишь анулирует const в семантическом контексте, т. е на уровне конструкций исходного кода, истинный const-объект должен помещаться в read-only память const_cast<> разрешит компилятору использовать const-объект как не-const, но только на уровне исходного кода -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Добавлю - последствия использование константного объекта, пропущенного через конст-каст, как неконстантного непредсказуемы. Нужен конст-каст для совместимости. Например, есть функция
возвращающая некоторрое значение, но неизменяющая строку (по хорошему, конечно, конст должен стоять - но такое возможно). Вот здесь юзаем конст-каст. Это сообщение отредактировал(а) Любитель - 10.2.2007, 16:43 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Любитель,
да, так оно и есть -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
А я и пишу семантическими конструкциями. И если четко непрописано, что менять нельзя - значит можно. Если данная конструкция допустима в рамках стандарта - а она допустима, в этом я убедился, значит не компилятора это дело учить программиста жизни. Предупредить - можно, а вылетать нельзя. В стандарте четко сказано, что такое преобразование возможно, но осуждается. Осуждается, но не запрещается. Хотя бы на приведенном примере. То, что это противоречит здравому смыслу - я не спорю, но это отдельная тема. Кстати, некторые примеры на Си показывали как делать полиморфный код. И эти коды рабочие (под ДОС). Не знаю как под виндами. Это уже прямая запись в сегмент кода (я не знаю доступен он для записи или нет). Но стандарт Си это разрешает (в Си++ не смотрел). В общем как я и сказал все равно каждый останется при своем мнении. Я остаюсь на стороне стандарта. |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Стандарт стандартом, а от реализации не убежишь
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Anikmar,
бесполезно с вами спорить следуйте стандарту и будьте счастливы -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Итак - все довольны
Но борланд в очередной раз опозорился |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Имеется мнение, что const_cast<type> равносильно (type*) и было введено лишь из соображений читабельности кода
Но почему помещается объект не в read-only - непонятно Это сообщение отредактировал(а) Xenon - 10.2.2007, 20:39 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
да понятно почему -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
MAKCim, а как тогда сделать неизменяймый участок памяти?
|
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |