RapidJSON не использует память после удаления элементов из сложного документа - PullRequest
0 голосов
/ 20 февраля 2019

[Это продолжение связанного вопроса здесь .]

Мой код имеет цикл, подобный следующему:

    Document d(kObjectType);
    while (not done() and getNewStuff(d)) {
        process(d);
        d.RemoveAllMembers();
    }

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

Документ, который заполняется getNewStuff(), является произвольно сложным (то есть он может содержать вложенные объекты, массивы, массивыобъектов и т. д.), и он использует метод выделения по умолчанию.Ответ на предыдущий вопрос показал, что когда вложенные объекты и / или массивы будут уничтожены, их хранилище будет возвращено распределителю (а не системе).Это объясняет, почему потребление памяти процессом не уменьшается при удалении элементов.(Тем не менее, через Valgrind я подтвердил, что «утечки памяти» нет, потому что память все еще правильно учтена и, когда процесс завершается, все должным образом освобождается.)

Однако,это не объясняет, почему потребление памяти процессом продолжает расти с течением времени.Кажется очевидным, что вызов RemoveAllMembers() является , а не , что делает память, лежащую в основе этих членов, доступной для повторного использования последующими вызовами AddMembers() (и т. Д.).

Мой вопрос: что делать?Мне нужно сделать, в дополнение к или вместо вызова RemoveAllMembers(), чтобы разрешить повторное использование моего Document объекта (d) на следующей итерации?

(Кстати, я пытался переместитьобъявление d внутри цикла, и это действительно приводит к желаемому поведению памяти, но я бы предпочел избежать затрат на деструкцию и реконструкцию d на каждой итерации.)

Спасибо!

...