![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Mr_Nuke |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 6.4.2007 Репутация: нет Всего: нет |
на счет конструктора разобрался!
![]() Везде, где мы выделяем память, мы выделяем на 1 байт(или бит), тоесть дописываем +1 к необходимой длинне; как нас учили, это делается для того, что бы руками потом дописывать "\0", показывая конец строки. но мы этого не делаем. Первый вопрос: почему тогда информация сохраняется верной? ведь мы выделили память на 1 байт больше, чем записали, т.е. один байт остается свободным. почему туда не записывается какой либо мусор? и если мы всеравно ничего не дописываем, почему мы не можем не выделять на один байт больше? т.е. не выделять этот лишний байт. Если не писать +1, то в конструкторе копирования, в нужную нам строчку дописывается какой то символ в конце. Так куда он пишется, если мы не выделяли место под этот символ? Это сообщение отредактировал(а) Mr_Nuke - 8.4.2007, 19:39 |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
Mr_Nuke |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 6.4.2007 Репутация: нет Всего: нет |
Всё! всем огромное спасибо!
![]() ![]() zkv и bsa! вам отдельное спасибо! если бы мог - влепил бы вам по плюсику в репутацию) но пока у меня постов маловато ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Нет, освобождает ровно столько, сколько по адресу s выделено. Другое дело, что деструктор вызывается только для одного объекта (первого символа), и именно этим отличается от delete[] s - последний вызовет деструктор для каждого символа. Но в данном случае это не существенно - это же просто символы. Не надо быть святее папы Римского ![]() Добавлено через 3 минуты и 6 секунд И никакое это не UB, а вполне стандартное поведение -------------------- ... |
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
||||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Xenon, у меня по твоей ссылке пустая страница открывается...
Но тем не менее, что тут может быть UB - удалится весь выделенный блок или нет? -------------------- ... |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Вот, вроде нашла, что ты имел ввиду, Xenon:
Оно? Только здесь написано, что UB, если вызвать delete для array object pointer. И еще про "If the operand has a class type". Конечно UB - память удалится, а часть объектов не разрушится - в зависимости от объектов может случиться что угодно. Так будет, если удалить без [] массив, скажем string... Только простые символы (и вообще встроенные типы) так рассматривать не стоит... Ну сам подумай, какое UB тут может быть? -------------------- ... |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Теперь, думаю, сомнений нет?
![]()
Это сообщение отредактировал(а) Xenon - 9.4.2007, 20:58 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ну да, да, это аргумент, действительно...
Я, конечно, имела в виду встроенные операторы, а не переопределенные. Только я сразу пристрелю программиста в моей группе, если он вздумает переопределить delete и delete[] несовместимо. Да и вообще переопределить delete для встроенных типов. Ей-богу, вреда от каких переопределений в долгосрочной перспективе гораздо больше чем пользы. Если уж приспичило выделять память для интов через ж. коленом, так делать это нужно явно, шоб ясно было видно: MySuperCrazyIntAlloc() \ MySuperCrazyIntFree() ! Но формально ты прав. -------------------- ... |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Мне тут скоро писать лабу-курсак... Там как раз надо хоть раз выделить память собственным аллокатором... Я все думал, как назвать ![]() оффтоп, конечно. зачем же так сразу... может, он решит пошутить ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
![]() Это будет гуманитарная акция... Потому что после того, как другие программисты, промаявшись с экзотическим поведением совершенно нормально выглядящего кода, обнаружат причину, его смерть будет долгой и мучительной... ![]() ![]() ![]() -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |