Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2020, 17:42   #1
dita137
Новичок
Джуниор
 
Регистрация: 16.01.2020
Сообщений: 3
По умолчанию С: Удаление строковых литералов из памяти

Добрый день. Вопрос именно по Си (без ++) и именно для моей конкретной ситуации. Поэтому malloc/free не предлагать
Собственно вопрос такой. Имеем в некоторой функции массив char s[100000]. Он в длительном цикле заполняется различными символами, потом эти символы заменяются на другие и т.д. много-много раз. Массив заполняется, в основном, с помощью strcat(s, "набор символов").
Если я правильно понимаю, то все символы, которыми я заполняю s, остаются где-то в памяти (даже после того, как я их уже "заменил" в массиве другими символами). Из-за этого размер памяти, используемой данной функцией, неуклонно увеличивается, пока она работает (за счет того, что больше не нужные символы накапливаются в памяти).
Опять же, если я правильно понимаю, при выходе из данной функции память, занятая под все эти символьные константы, созданные ею, освобождается автоматически.
Однако я хотел бы узнать, есть ли способ освобождать память от ненужных символьных констант еще в процессе работы самой этой функции? Заранее благодарю за конструктивные ответы.
dita137 вне форума Ответить с цитированием
Старый 16.01.2020, 20:10   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

memmov(s + 10, s + 15, strlen(s + 15) + 1);
Удаляет все между 10 и 15 позицией.
Если удалять надо всегда из начала массива, тогда читайте про ring buffer - будет гораздо эффективнее.
waleri вне форума Ответить с цитированием
Старый 16.01.2020, 20:16   #3
dita137
Новичок
Джуниор
 
Регистрация: 16.01.2020
Сообщений: 3
По умолчанию

waleri, большое спасибо за наводку!
dita137 вне форума Ответить с цитированием
Старый 17.01.2020, 12:12   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от dita137 Посмотреть сообщение
Если я правильно понимаю, то все символы, которыми я заполняю s, остаются где-то в памяти (даже после того, как я их уже "заменил" в массиве другими символами).
нет конечно, после замены они нигде не остаются.

Утечка памяти, скорее всего, при неправильной работе с пересозданием массива (если он динамический).

Если же массив статический или созданный всего один раз динамический на определённый размер, то количество сожранной памяти не поменяется.

Ну и да - либо циклический буфер, либо FIFO со сдвигом
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка строковых литералов FlipFan Общие вопросы C/C++ 0 20.11.2012 11:16
Удаление связного списка из памяти Mahin Общие вопросы C/C++ 3 13.07.2012 10:10
Зацикливание при удаление памяти coNsept Общие вопросы C/C++ 4 23.06.2012 18:00
выделение дин памяти и удаление Nekesh Общие вопросы C/C++ 2 11.10.2010 13:30
Aлгоритм шифрования строковых литералов. ATAMAN200 Общие вопросы C/C++ 2 24.09.2010 12:41