![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Dmitry_177 |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
При использовании API функций часто бывает пользуются такой схемой:
Так вот я хотел бы спросить, как потом правильней будет укоротить спроку, так:
или так:
И еще, потом после использования переменной str, т.е. когда она стала ненужной, нужно ли ей задавать нулевой размер, т.е так:
чтобы в памяти она не занимала места? |
||||||||
|
|||||||||
Poseidon |
|
||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Высвободится память сразу после выполнения функции или процедуры, в каторой обьявлена переменная.
Это сообщение отредактировал(а) Poseidon - 20.5.2007, 02:39 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||
|
|||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
А если будет такая схема:
а потом в этой же функции или процедуре нужно str присвоить какую-нибудь строку str := 'vbrftgbtrbrtntrentrnrthne'; так вот если присваемая строка будет длиннее чем мы задали SetLength-ем, она обрежется? ИМХО вообще наверно переполнение будет.. Как сделать из str опять обычный string? |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
чаще всего функции WinApi возвращают длину возвращаемой строки...
-------------------- There are always someone smarter than you... |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Второе просто производит больше ненужных действий. Нет не нужно. При выходе за пределы видимости вся память, занимаемая строкой, будет освобождена автоматически. Строка автоматически изменит свой размер. При прямом присвоении уже не имеет значения, что там ей раньше присваивалось и какой размер устанавливался. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Dmitry_177, передавать в API лучше всего строку типа
str : array[0..size] of char; с нулем на конце. При конвертировании String в PChar нарушается работа подсчета ссылок в строках типа String. В результате легко испортить данные по выходу из процедуры. Если размер строки неизвестен, то можно воспользоваться следующим способом.
Каждый остается со своей строкой. Делфийская прога с делфийской, а винда с сишной строкой. Только прийдеться уже вручную освобождать память строки myStr, тогда когда она уже будет не нужна. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
У меня еще вопрос.. делаем мы так:
ведь строка же должна завержаться нулевым символом, а это значит еще один символ.. Так вот чтобы правильно все было сколько нужно задать в SetLength и в какойнибудь API на примере с MAX_PATH? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Dmitry_177, ansi строки всегда завершаются нулем. Это делает компилятор за нас. Потому они совместимы с PChar.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Я это почему спросил вообще, чтобы избежать переполнения буфера, т.е. чтобы не записывался нуль за пределом MAX_PATH..
|
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Я где-то слышал что, когда выполняется SetLength(str, MAX_PATH), для str резервируется MAX_PATH+1 байт. Лишний байт - это как раз для нулевого символа в конце, который при обычной работе со stringом добавляется автоматически.. Правда ли это?
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Alexeis, да, но если задаем размер строки MAX_PATH символов, и API функция передаст в нее ровно MAX_PATH символов.. получится так что нулевой символ туда уже не запишется.. Вот я и спрашиваю нужноли MAX_PATH +1 делать? И еще: Я где-то слышал что, когда выполняется SetLength(str, MAX_PATH), для str резервируется MAX_PATH+1 байт. Лишний байт - это как раз для нулевого символа в конце, который при обычной работе со stringом добавляется автоматически.. Правда ли это?
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Dmitry_177, для строки резервируется length(s) + 9 байт, 4 для счетчика ссылок 4 для длинны и 1 для завершающего нуля.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |