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
,但它可能会生成更漂亮的代码。)