Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Если рассудок и жизнь дороги вам, держитесь подальше от указателей на char и никогда не используйте их для работы со строковыми значениями

Цитата:
name(char *sname) {
strname=new char[256];
strname=sname;
}
Вы думаете, что ваша программа копирует строку, переданную в метод класса через параметр, в поле класса, для которого выделили область памяти?
Нет. Ваша программа
1. Выделяет область памяти и сохраняет адрес этой области в значении указателя strname, который является полем класса
2. Заменяет адрес в указателе strname адресом из указателя sname

Таким образом указатели strname и sname содержат адрес одного и того же массива символов. Таким образом "изменяя строку strname" вы изменяете и "строку sname".
А почему? Да потому что это - не строки, а указатели, говорящие "объект находится там".
Более того, при этом область памяти, выделенная командой "strname=new char[256]", безвозвратно теряется, поскольку нет ни одного указателя, хранящего её адрес. Эту память нельзя будет освободить иначе, как прекратив выполнение программы.
Работа со строковыми значениями через указатели на символы производится через специальные функции, и это - крайне сложная задача, требующая тщательнейшего понимания сути выполняемых действий и строжайшего самоконтроля.
Посему для работы со строками можно использовать только классы строковых контейнеров - string, AnsiString и т.д. А char* - только там, где это действительно требуется для достижения максимальной производительности вычислений.

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

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:04, 15-12-2011 | #2