![]() |
|
Модераторы: bsa |
![]()
|
|
| Ninazu |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.2.2013 Где: Киев Репутация: нет Всего: 1 |
Для работы функции необходимо 20 символов, которые я резервирую и освобождаю в конце, чтобы не было утечки. Как понимаю функция должна вернуть некий промежуточный буфер, который автоматически освободится по её завершению, но как это все работает еще не понял.
Знаю что сейчас полетят тумаки. Но раздел ведь для новичков. Поиском пользовался. (Или помогите сформировать правильный запрос) |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
если это C++ То вариант, например, такой (есть и другие)
Это сообщение отредактировал(а) korian - 12.2.2013, 02:46 |
|||
|
||||
| Ninazu |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.2.2013 Где: Киев Репутация: нет Всего: 1 |
Больше интересны другие варианты. Ближе к чистому Си. У меня цель изначально стоит понять как всё может работать, поэтому сразу отказался от шаблонов уже готовых. Ведь используя их перестаешь задумываться о механизмах которые ими движут. До этого баловался с Basic'ом, но там всё просто, и голову себе не забиваешь, о чём сейчас жалею. Приходиться переучивать себя в каких-то моментах.
Хотя с другой стороны, понять сами алгоритмы это одно, но нужно следовать стандарту и не изобретать велосипед |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Тогда почему не
Что именно Вы хотите вернуть? Тот самый временный буфер или что-то иное? Что Вы подразумеваете под этим "всё"? Это сообщение отредактировал(а) feodorv - 12.2.2013, 04:01 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Никак не работает. В С (да и в С++) нет автоматического сборщика мусора, так что все, что вы запрашивали с кучи, должно быть явно возвращено туда же. Использовать уже освобожденные участки памяти категорически нельзя - эта память уже принадлежит менеджеру кучи, а не вам. И то, что там случайно осталось прежнее содержимое - это большое везение (или наоборот, невезенье - как посмотреть Единственное (ну почти единственное) средство (в чистом С) - это статически расположенные буфера. Указатели на них можно возвращать, но тут будет проблема с несколькими вызовами таких функций, данные от предыдущего вызова будут потерянны. |
|||
|
||||
| Ninazu |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.2.2013 Где: Киев Репутация: нет Всего: 1 |
Вот мне это (ну почти единственное) покоя и не дает. А буфере тоже думал, выделить в начале программы, и освободить в конце. Но тут два момента скользких 1. Размер буфера, могут возникнуть ситуации когда его прийдется расширить. 2. Как вы и описали множественные обращения к нему. По большому счёту в тех же потоках. Можно конечно мьютексами прикрыться или создавать буфер для каждого потока. Но как-то это всё не феншуйно. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Это не поможет А вот это поможет. Собственно CRT, а точнее те функции из нее, которые пользуются статическими данными внутри себя (strtok например), так и делают См. TLS |
|||
|
||||
| korian |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
обычно размер буфера зарание известен. Или известен максимально возможный размер. В C обычно пишут так:
|
||||
|
|||||
| Zmaster555 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 14.1.2013 Репутация: нет Всего: нет |
Немного не понятно, как (и зачем) функция вернет то, что она уже освободила? Скорее всего ты неправильно сформулировал вопрос. Мне кажется korian написал то, что тебе нужно. Т.е. память для буфера должна выделяться вне функции, и в функцию передаваться только адрес буфера, и освобождаться он должен опять же вне функции. А функция нужно только для того чтобы работать с уже переданным в нее буфером (точнее указателем на него). |
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Совсем нет. Тебя ничто не отвлекает о решения поставленной задачи, а о реализации того или иного шаблона можно легко догадаться по выполняемым действиям.
|
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |