![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| cemick |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 2 Всего: 6 |
Наткнулся на тему http://stackoverflow.com/questions/1951192...ing-var-strings
и вот такой пример
Мне не совсем понятно, что происходит и почему комментирование строчки UniqueString(s); приводит к ошибке:
Как я понимаю UniqueString гарантирует уникальность строки, просто копируя AnsiString строку в памяти. Const же параметр передается по ссылки, но компилятор следит за тем, что бы значение параметра не менялось и не передався ни кому указатель на строку, где она могла бы изменится. Не понятно, почему после UniqueString, константная строка ведет себя как объект. Вот как то так не понятно. |
||||
|
|||||
| Amphiluke |
|
||||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
Так что, видимо, это не только UniqueString() касается.
|
||||
|
|||||
| cemick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 2 Всего: 6 |
UniqueString не просто копирует строку в памяти? А вносит какие то изменения, которые позволяют при
p := PChar(Value); p[3] := '?'; определить что это уникальная строка? Ведь после s := 'var string'; количество ссылок на s тоже равно 1. Чем тогда отличается s от того, что получаем после UniqueString (s) |
|||
|
||||
| Amphiluke |
|
|||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
Запись
указывает компилятору разместить строковую константу в области сегмента кода, доступной только для чтения. Приведение типа к PChar не обеспечивает копирования строки из сегмента кода в динамическую память, а просто заносит указатель на константу в переменную типа PChar, поэтому попытка изменения строки приводит к AV. А UniqueString как раз выполняет такое копирование в область памяти, доступную для изменения… Да, впрочем, что рассказывать: вот здесь почитайте. Это сообщение отредактировал(а) Amphiluke - 26.12.2009, 15:27 |
|||
|
||||
| cemick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 2 Всего: 6 |
хм, как я понял из
var s: String; s := 'var string'; - это константа размещенная в сегменте кода и у нее число ссылок должно быть равным -1? Смотрю количество ссылок: PInteger(Integer(@s[1])-8)^ Получаю 1. Почему? |
|||
|
||||
| Amphiluke |
|
|||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
А вы посмотрели 5-й пример? Указатель, полученный с применением оператора @ указывает на область памяти, доступной для изменения. Следовательно, счетчик ссылок не равен -1.
Попробуйте:
|
|||
|
||||
| cemick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 2 Всего: 6 |
UniqString_Const.pas.32: P := @s[1]; 0045A856 8D45F8 lea eax,[ebp-$08] 0045A859 E8E2A4FAFF call @UniqueStringA 0045A85E 8945F0 mov [ebp-$10],eax Во как оказывается, теперь все встало на свои места. Спасибо! Первый раз сталкиваюсь с областью "сегмент кода", поиск конечно же рулит, но может есть ссылки где можно поподробнее почитать об этом. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |