Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неправильная работа деструктора 
:(
    Опции темы
Mr_Nuke
Дата 8.4.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



на счет конструктора разобрался! smile  только вот еще одно)
Везде, где мы выделяем память, мы выделяем на 1 байт(или бит), тоесть дописываем +1 к необходимой длинне;
как нас учили, это делается для того, что бы руками потом дописывать "\0", показывая конец строки. но мы этого не делаем. 
Первый вопрос: почему тогда информация сохраняется верной? ведь мы выделили память на 1 байт больше, чем записали, т.е. один байт остается свободным. почему туда не записывается какой либо мусор?

и если мы всеравно ничего не дописываем, почему мы не можем не выделять на один байт больше? т.е. не выделять этот лишний байт.

Если не писать +1, то в конструкторе копирования, в нужную нам строчку дописывается какой то символ в конце. Так куда он пишется, если мы не выделяли место под этот символ? 



Это сообщение отредактировал(а) Mr_Nuke - 8.4.2007, 19:39
PM MAIL   Вверх
zkv
Дата 8.4.2007, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Mr_Nuke @  8.4.2007,  19:36 Найти цитируемый пост)
и если мы всеравно ничего не дописываем

кто сказал что мы ничего туда не записываем?
В следующем примере это сделает функция strcpy().
Код

str( const str &obStr )
{
  this->n=obStr.n;
  s= new char[ n + 1];
  strcpy( s,  obStr.s );
}

Остальные вопросы снимаются, как я понимаю smile
PM MAIL   Вверх
Mr_Nuke
Дата 8.4.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Всё! всем огромное спасибо! smile  на данный момент вопросов больше нету! Если че бут непонятно -  еще отпишусь  smile 

zkv и bsa! вам отдельное спасибо! если бы мог - влепил бы вам по плюсику в репутацию) но пока у меня постов маловато  smile 
PM MAIL   Вверх
Earnest
Дата 9.4.2007, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(threef @  7.4.2007,  01:24 Найти цитируемый пост)
иначе будет утечка памяти.
  delete s;
освобождает память размером с один символ  

Нет, освобождает ровно столько, сколько по адресу s выделено. Другое дело, что деструктор вызывается только для одного объекта (первого символа), и именно этим отличается от delete[] s - последний вызовет деструктор для каждого символа. Но в данном случае это не существенно - это же просто символы.
Не надо быть святее папы Римского smile

Добавлено через 3 минуты и 6 секунд
И никакое это не UB, а вполне стандартное поведение


--------------------
...
PM   Вверх
Xenon
Дата 9.4.2007, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50





--------------------
user posted image  
PM MAIL   Вверх
Earnest
Дата 9.4.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Xenon, у меня по твоей ссылке пустая страница открывается...
Но тем не менее, что тут может быть UB - удалится весь выделенный блок или нет?


--------------------
...
PM   Вверх
Daevaorn
Дата 9.4.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Earnest @  9.4.2007,  21:25 Найти цитируемый пост)
у меня по твоей ссылке пустая страница открывается...

там последнии [] - часть ссылки
Цитата(Earnest @  9.4.2007,  21:25 Найти цитируемый пост)
Но тем не менее, что тут может быть UB - удалится весь выделенный блок или нет?

всё
PM MAIL WWW   Вверх
Earnest
Дата 9.4.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Вот, вроде нашла, что ты имел ввиду, Xenon:

Цитата

2 If the operand has a class type, the operand is converted to a pointer type by calling the above-mentioned
conversion function, and the converted operand is used in place of the original operand for the remainder of
this section. In either alternative, if the value of the operand of delete is the null pointer the operation
has no effect. In the first alternative (delete object), the value of the operand of delete shall be a pointer
to a non-array object or a pointer to a sub-object (1.8) representing a base class of such an object (clause
10). If not, the behavior is undefined. In the second alternative (delete array), the value of the operand of
delete shall be the pointer value which resulted from a previous array new-expression. If not, the
behavior is undefined.

Оно?
Только здесь написано, что UB, если вызвать delete для array object pointer. 
И еще про "If the operand has a class type". Конечно UB - память удалится, а часть объектов не разрушится - в зависимости от объектов может случиться что угодно. 
Так будет, если удалить без [] массив, скажем string...
Только простые символы (и вообще встроенные типы) так рассматривать не стоит... Ну сам подумай, какое UB тут может быть?


--------------------
...
PM   Вверх
Daevaorn
Дата 9.4.2007, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Earnest @  9.4.2007,  21:50 Найти цитируемый пост)
 Ну сам подумай, какое UB тут может быть?

ну допустим у меня на микроконтролере память под массивы отдельно от остальной для оптимизации.
PM MAIL WWW   Вверх
Xenon
Дата 9.4.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Теперь, думаю, сомнений нет? smile
Цитата
[16.12] Can I drop the [] when deleteing array of some built-in type (char, int, etc)?
No! 
Sometimes programmers think that the [] in the delete[] p only exists so the compiler will call the appropriate destructors for all elements in the array. Because of this reasoning, they assume that an array of some built-in type such as char or int can be deleted without the []. E.g., they assume the following is valid code: 

    void userCode(int n)
    {
      char* p = new char[n];
      // ...
      delete p;     // <— ERROR! Should be delete[] p !
    } 
But the above code is wrong, and it can cause a disaster at runtime. In particular, the code that's called for delete p is operator delete(void*), but the code that's called for delete[] p is operator delete[](void*). The default behavior for the latter is to call the former, but users are allowed to replace the latter with a different behavior (in which case they would normally also replace the corresponding new code in operator new[](size_t)). If they replaced the delete[] code so it wasn't compatible with the delete code, and you called the wrong one (i.e., if you said delete p rather than delete[] p), you could end up with a disaster at runtime.


Это сообщение отредактировал(а) Xenon - 9.4.2007, 20:58


--------------------
user posted image  
PM MAIL   Вверх
Earnest
Дата 9.4.2007, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Ну да, да, это аргумент, действительно...
Я, конечно, имела в виду встроенные операторы, а не переопределенные. 
Только я сразу пристрелю программиста в моей группе, если он вздумает переопределить delete и delete[] несовместимо. 
Да и вообще переопределить delete для встроенных типов.
Ей-богу, вреда от каких переопределений в долгосрочной перспективе гораздо больше чем пользы.
Если уж приспичило выделять память для интов через ж. коленом, так делать это нужно явно, шоб ясно было видно: MySuperCrazyIntAlloc() \ MySuperCrazyIntFree() !

Но формально ты прав.


--------------------
...
PM   Вверх
JackYF
Дата 10.4.2007, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Earnest @  9.4.2007,  21:05 Найти цитируемый пост)
MySuperCrazyIntAlloc() \ MySuperCrazyIntFree() !


Мне тут скоро писать лабу-курсак... Там как раз надо хоть раз выделить память собственным аллокатором... Я все думал, как назвать  smile 
оффтоп, конечно.



Цитата(Earnest @  9.4.2007,  21:05 Найти цитируемый пост)
Только я сразу пристрелю программиста в моей группе

зачем же так сразу... может, он решит пошутить smile



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Earnest
Дата 10.4.2007, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



 smile 
Цитата(JackYF @  10.4.2007,  02:02 Найти цитируемый пост)
зачем же так сразу... может, он решит пошутить

Это будет гуманитарная акция...
Потому что после того, как другие программисты, промаявшись с экзотическим поведением совершенно нормально выглядящего кода, обнаружат причину, его смерть будет долгой и мучительной...
 smile  smile  smile 


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0797 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.