Memory RapidJSON没有';从复杂文档中删除成员后,不要重用内存

Memory RapidJSON没有';从复杂文档中删除成员后,不要重用内存,memory,memory-leaks,rapidjson,Memory,Memory Leaks,Rapidjson,[这是后续行动。] 我的代码有如下循环: Document d(kObjectType); while (not done() and getNewStuff(d)) { process(d); d.RemoveAllMembers(); } 虽然此代码生成所需的结果,但每次迭代似乎都会为文档的成员分配新的内存;而且,当代码在有限的配置中运行时,它会耗尽所有内存并提前终止 由getNewStuff()填充的文档任意复杂(即,它可能包含嵌套

[这是后续行动。]

我的代码有如下循环:

    Document d(kObjectType);
    while (not done() and getNewStuff(d)) {
        process(d);
        d.RemoveAllMembers();
    }
虽然此代码生成所需的结果,但每次迭代似乎都会为文档的成员分配新的内存;而且,当代码在有限的配置中运行时,它会耗尽所有内存并提前终止

getNewStuff()
填充的文档任意复杂(即,它可能包含嵌套对象、数组、对象数组等),并且使用默认的分配方法。对上一个问题的回答表明,当嵌套对象和/或数组被销毁时,它们的存储将返回给分配器(而不是系统)。这解释了为什么删除成员时进程内存消耗不会下降。(但是,我已经通过Valgrind确认没有“内存泄漏”,因为内存仍然被正确地占用,并且当进程退出时,所有内存都被正确地释放。)

然而,这并不能解释为什么进程内存消耗会随着时间的推移而不断增加。显然,对
RemoveAllMembers()
的调用并没有使这些成员下面的内存可供后续的
AddMembers()
(等)调用重用

我的问题是,除了调用
RemoveAllMembers()
之外,我还需要做什么来代替调用
RemoveAllMembers()
,以便在下一次迭代中重用我的
文档
对象(
d

(顺便说一句,我尝试将
d
的声明移动到循环的内部,这确实产生了所需的内存行为,但我宁愿避免每次迭代时破坏和重新构造
d
的开销。)


谢谢

这可能会回答您的问题:谢谢,@jciloa——看起来我应该使用
d.SetObject()
而不是
d.RemoveAllMembers()
。有机会我会试试的。(我怀疑结果与我目前使用的方法没有什么不同,只是在循环中声明
d
,但它可能会产生更漂亮的代码。)这可能会回答您的问题:谢谢,@jciloa——看起来我应该使用
d.SetObject()
而不是
d.RemoveAllMembers()
。有机会我会试试的。(我怀疑结果与我目前使用的方法没有什么不同,只是在循环中声明
d
,但它可能会生成更漂亮的代码。)