Трудно обнаружить утечку памятиC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Трудно обнаружить утечку памяти

Сообщение Anonymous »


Я придумал решение для анализа фрагментированных потоковых данных. Данные содержат несколько наборов данных, которые легко идентифицировать по последовательности начала и остановки.

Функция, получающая фрагментированные данные, вызывает appendToBuffer(data, data_length); для каждого поступившего нового фрагмента.

Функция AppendToBuffer также вызывает функцию обработки. Функция обработки проанализирует первый набор данных, доступный в буфере (рекурсивно), и выдаст обратный вызов о количестве байтов, которые были проанализированы рекурсивно. Эти байты затем удаляются из начала буфера.

Когда на этом этапе поступают новые фрагментированные данные, буфер расширяется, что я реализовал в функции Safe_realloc, данные копируются в буфер, и процесс анализа повторяется.

У меня утечка памяти, это точно. Я вижу, что куча значительно уменьшается с каждым поступающим битом данных. Я включил анализатор памяти, который, очевидно, указывает на утечку в функции malloc Safe_realloc, но я думаю, что это происходит только потому, что трассировка кучи существует только вокруг вызова функции AppendToBuffer и ожидает, что любая выделенная память будет освобождена при каждом возврате функции. Однако намеренно буфер остается нетронутым всякий раз, когда функция AppendToBuffer возвращает значение.

Может ли кто-нибудь помочь мне решить проблему с утечкой памяти?
bool AppendToBuffer(uint8_t* data, size_t len){ // Либо создаем новый буфер, либо увеличиваем существующий if(длина == 0 || буфер == NULL){ если (буфер! = NULL) свободный (буферный); ESP_LOGD(TAG, «Новый буфер»); буфер = (char*)malloc(len); }еще{ ESP_LOGD(TAG, «Буфер реального распределения»); буфер = Safe_realloc (буфер, длина, длина + длина); } ESP_LOGD(TAG,"Свободная куча: %u", (unsigned int) esp_get_free_heap_size()); утверждать (буфер! = NULL); // Копируем новые данные в буфер в нужном месте, длина которого уже находится в буфере memcpy(буфер + длина, данные, длина); // Буфер только что увеличился в размерах длина += длина; // Обрабатываем текущий буфер и узнаем, что удалить из начала буфера size_t bytesProcessed =processBuffer(); // Удаляем эти байты из начала буфера size_t tempBufferLength = длина байтовОбработано; // Удалить первую vCard в буфере, как она была обработана if (bytesProcessed > 0 && tempBufferLength > 0){ char* tempBuffer = (char*)malloc(tempBufferLength); // Копируем буфер, кроме первой vCard, во временный буфер memcpy(tempBuffer, буфер+bytesProcessed, tempBufferLength); свободный (буферный); // Сжимаем буфер буфер = (char*)malloc(tempBufferLength); утверждать (буфер! = NULL); // Копируем временный буфер обратно в буфер memcpy (буфер, tempBuffer, tempBufferLength); // Очищаем временный буфер бесплатно (tempBuffer); // Устанавливаем длину длина = tempBufferLength; } ESP_LOGD(TAG, "Оставшийся буфер: (len=%d) %s", length, buffer); // Если все данные в буфере проанализированы, освобождаем буфер если (длина == 0) { ESP_LOGD(TAG, «Освобождение буфера»); свободный (буферный); } вернуть истину; } static char*safe_realloc(char* original, size_t original_len, size_t new_len){ если (исходный_лен == новый_лен) вернуть оригинал; если (new_len == 0) { бесплатно (оригинал); вернуть НУЛЬ; } char* буфер = (char*)malloc(new_len); утверждать (буфер! = NULL); утверждать (оригинал! = NULL); если (new_len < original_len) { // Сжимается, копируются только первые байты new_len memcpy(буфер, оригинал, new_len); } еще { // Расширяем, копируем весь исходный буфер memcpy(буфер, оригинал, original_len); } бесплатно (оригинал); возвратный буфер; }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как обнаружить утечку памяти с помощью GTest на C++ на платформе Linux
    Anonymous » » в форуме C++
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Pyasn decoder.decode вызывает утечку памяти, поскольку статистика докера показывает постоянный рост памяти (pysnmp=4.4.1
    Anonymous » » в форуме Python
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Вызывает ли сохранение ссылки на LazyListState в ViewModel утечку памяти?
    Гость » » в форуме Android
    0 Ответы
    44 Просмотры
    Последнее сообщение Гость
  • Как отслеживать утечку памяти в JNI с помощью Android Studio Profiler или других
    Anonymous » » в форуме Android
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Ios Не могу найти утечку памяти в контроллере просмотра
    Anonymous » » в форуме IOS
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»