Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранилище... Tag, или Edit1.Tag:=Integer('string') 
:(
    Опции темы
Alexeis
Дата 3.3.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(MetalFan @  3.3.2007,  10:14 Найти цитируемый пост)
Alexeis, те же яйца, только сбоку.

  Не совсем те. В делфи 'string' означает просто строку, любую, какую конкретно, компилятор узнает на этапе присваивания. Такие константы обычно создаются в системной области констант  
AnsiString('string') - указывает, что строка должна быть ансистринг, а вот операция @AnsiString('string')[1], не так очевидна как кажется, при такой попытке обращения к элементам строки компилятор решает создать дубликат строки в общей памяти доступной для записи. Так что Edit2.Text, получает свою законную копию строки.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 3.3.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Alexeis @  3.3.2007,  12:36 Найти цитируемый пост)
операция @AnsiString('string')[1], не так очевидна как кажется, при такой попытке обращения к элементам строки компилятор решает создать дубликат строки в общей памяти доступной для записи

откуда такие данные?
при выполнении следующего кода получаем одинаковые значения...
Код

  lStr := 'string';
  lInt1 := Integer(@AnsiString(lstr)[1]);
  lInt2 := Integer(PChar(lstr));

и где там дубликат??

ладно, мы тут в дебри углубились.

вывод из всего этого только один: чтобы в дальнейшем не возникло проблем в виде непонятно откуда взявшихся AV и утечек памяти, лучше сразу самому выделять и освобождать память, используя PChar.

Это сообщение отредактировал(а) MetalFan - 3.3.2007, 13:02


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexeis
Дата 3.3.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(MetalFan @  3.3.2007,  12:55 Найти цитируемый пост)
при выполнении следующего кода получаем одинаковые значения...

  Точно! Вот хитрый гад этот компилятор! Одну и ту же оперыцию в разных контекстах понимает по разному  smile . Ну мы все равно его обманем вот так

Код

  Edit1.Tag  := Integer(@AnsiString('string')[1]);
  Edit2.Text := Copy(AnsiString(pointer(Edit1.Tag)));


Теперь точно у каждого своя копия smile

Добавлено @ 13:27 
Цитата(MetalFan @  3.3.2007,  12:55 Найти цитируемый пост)
в виде непонятно откуда взявшихся AV

  Это будет, а на счет утечек памяти нет, компилятор слишком для этого умный. С AnsiString такое почти не реально, разве что насильно записать ему более короткую длинну, да и то не факт, что сработает, он запоминает сколько выделял памяти, а не проверяет длину строки, потому по выходу из процедуры освободит правильное количество памяти. В это и прелесть анси строк в противоположность пчарам. Анси строки уж слишком стабильные.

Это сообщение отредактировал(а) Alexeis - 3.3.2007, 13:28


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 3.3.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Alexeis, ну правильно. copy припахал)
да только в случае с динамическиформируемой строкой словишь опять же AV.
короче НЕРЕКОМЕНДУЮ использовать содержимое AnsiString отдельно от переменных типа AnsiString. 
ибо не один из привеленных выше способов 100% не работоспособен.
з.ы. string = AsniString, если включена опция Huge Strings.
так что согласись, Alexeis, твой пример - все таки "те же яйса..." ;)

Цитата(Alexeis @  3.3.2007,  13:20 Найти цитируемый пост)
на счет утечек памяти нет, компилятор слишком для этого умный. С AnsiString такое почти не реально, разве что насильно записать ему более короткую длинну, да и то не факт, что сработает, он запоминает сколько выделял памяти, а не проверяет длину строки, потому по выходу из процедуры освободит правильное количество памяти. В это и прелесть анси строк в противоположность пчарам. Анси строки уж слишком стабильные.

да, поэтому по выходу из процедуры, где использовалась локальная переменная типа string(ansistring), и на которую был "запомнен" указатель, в итоге приведет к AV при попытке обращения к уже освобожденной по окончанию процедуры содержимому строки...
но если "подкрутить" refCount, то теоретически память под строку не будет освобождена... но это грозит утечками и дальнейшей несовместимостью в случае изменения логики компилятора

Это сообщение отредактировал(а) MetalFan - 3.3.2007, 13:35


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexeis
Дата 3.3.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(MetalFan @  3.3.2007,  13:30 Найти цитируемый пост)
так что согласись, Alexeis, твой пример - все таки "те же яйса..." ;)

  Никогда не интересовался такой жуткой методикой издевательства над языком и не хочется особенно влезать в тонкости и глюки кривых подходов к программированию, лучше почитаю, про хорошие  smile 
Короче присоединяюсь к пожеланию MetalFan не использовать такие средства вообще, и использовать те средства которые были для этого придуманы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 3.3.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Alexeis, :beer:
жаль нету такого смайла тут)
з.ы.
есть предназначенные для таких "извращенств" средства - TStringList. про который я уже упоминал.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Yanis
Дата 6.3.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



W1zArD
Не понимаю, зачем хранить текст в Tag? Его же можно хранить в свойстве Text smile 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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