[Это продолжение связанного вопроса здесь .]
Мой код имеет цикл, подобный следующему:
Document d(kObjectType);
while (not done() and getNewStuff(d)) {
process(d);
d.RemoveAllMembers();
}
Хотя этот код создаетжелаемые результаты, каждая итерация выделяет новую память для членов документа;и когда код выполняется в ограниченных конфигурациях, он исчерпывает всю память и преждевременно завершается.
Документ, который заполняется getNewStuff()
, является произвольно сложным (то есть он может содержать вложенные объекты, массивы, массивыобъектов и т. д.), и он использует метод выделения по умолчанию.Ответ на предыдущий вопрос показал, что когда вложенные объекты и / или массивы будут уничтожены, их хранилище будет возвращено распределителю (а не системе).Это объясняет, почему потребление памяти процессом не уменьшается при удалении элементов.(Тем не менее, через Valgrind я подтвердил, что «утечки памяти» нет, потому что память все еще правильно учтена и, когда процесс завершается, все должным образом освобождается.)
Однако,это не объясняет, почему потребление памяти процессом продолжает расти с течением времени.Кажется очевидным, что вызов RemoveAllMembers()
является , а не , что делает память, лежащую в основе этих членов, доступной для повторного использования последующими вызовами AddMembers()
(и т. Д.).
Мой вопрос: что делать?Мне нужно сделать, в дополнение к или вместо вызова RemoveAllMembers()
, чтобы разрешить повторное использование моего Document
объекта (d
) на следующей итерации?
(Кстати, я пытался переместитьобъявление d
внутри цикла, и это действительно приводит к желаемому поведению памяти, но я бы предпочел избежать затрат на деструкцию и реконструкцию d
на каждой итерации.)
Спасибо!