Карта Protobuf продолжает выделять новые элементы для арены - PullRequest
1 голос
/ 03 февраля 2020

У меня есть код, который периодически обновляет значения карты protobuf. Этот код упрощен для ясности.

void my_periodically_called_function() {
    my_protobuf_map->Clear();
    MyObject obj;
    obj.set_value(data);
    my_protobuf_map['my_key'] = obj;
}

Что происходит, так это то, что память программы продолжает расти с каждой итерацией. После просмотра файла protobuf map.h кажется, что после очистки карты и повторного добавления элементов [] просто выделит больше данных на арену (без очистки каких-либо более старых данных), что, очевидно, нежелательно.

Что такое самый удобный способ решить эту проблему? Мне нужен хороший способ удалить определенную c память с арены.

Самый простой способ решить эту проблему - удалить Clear (), но я хотел бы сохранить это, чтобы избежать странные ошибки при сохранении старого состояния.

Заранее спасибо.

1 Ответ

1 голос
/ 04 февраля 2020

Способ, которым библиотека protobuf C ++ реализует распределение арены, не позволяет освободить отдельный фрагмент памяти. Вместо этого все это освобождается сразу, освобождая всю арену.

Главная задача распределителя арены - повысить скорость, сделав выделение постоянной операцией (она просто увеличивает указатель).

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

...