![]() |
|
|
![]()
|
|
| retto |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 167 Регистрация: 30.10.2007 Где: Кривой Рог, Украи на Репутация: нет Всего: нет |
Объясните пожалуйста почему так происходит.
AnsiString s = "first"; AnsiString s2 = AnsiString(s); s2 = "second"; переменная s осталась таже - "first", а s2 - "second". какбы все понятно и ясно. Но когда сделать вот так: AnsiString s = "first"; AnsiString s2 = AnsiString(s); char* ch = s2.c_str(); и потом что-то поменять в ch то изменится значение как переменной s так и s2. Почему меняется значение переменной s? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Потому что в VCL AnsiString обладают поведением copy-on-write и счетчиком ссылок. Когда одна строка копируется в другую, реального копирования не происходит, вместо этого они обе начинают ссылаться на одну и туже строку в памяти (при этом счетчик ссылок у строки увеличивается). Если же строка модифицируется (например так - s[1]='a'), то для нее создается уникальная копия в памяти (если она уже не была уникальной)
Функция c_str() возвращает указатель на реальную строку в памяти, копия не создается. Используйте AnsiString::Unique() метод перед модификацией строки через c_str() |
|||
|
||||
| retto |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 167 Регистрация: 30.10.2007 Где: Кривой Рог, Украи на Репутация: нет Всего: нет |
xvr, спасибо. то что надо.
з.ы. читаем читаем читаем читаем... книжки. |
|||
|
||||
| SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 9 Всего: 23 |
xvr, уж всё ответил пока я писал
Это сообщение отредактировал(а) SenkraD - 22.4.2010, 10:19 |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |