我正在使用rapidjson C++ 库 https://github.com/miloyip/rapidjson,使用此库您可以创建 JSON 对象。目前我有一些记忆问题。
情况:
在我当前的设置中,我创建了一个新对象,并向其添加了值成员和数组成员。该对象通过引用传递给多个函数并在我的程序流程中使用。
rapidjson::Value data;
data.SetObject();
while(...)
{
// --------------------------
// Add coordinates to object
JSON::AllocatorType& allocator = data.GetAllocator();
JSONValue region;
region.SetArray();
region.PushBack(rectangle.m_x1, allocator);
region.PushBack(rectangle.m_y1, allocator);
region.PushBack(rectangle.m_x2, allocator);
region.PushBack(rectangle.m_y2, allocator);
data.AddMember("regionCoordinates", region, allocator);
// --------------------------
// Add number of changes
data.AddMember("numberOfChanges", numberOfChanges, allocator);
... call function and pass data
... call function2 and pass data
if(data.MemberBegin() != data.MemberEnd())
{
data.EraseMember(data.MemberBegin(), data.MemberEnd());
}
}
我在循环中使用同一个对象,因此在再次添加成员之前删除了该对象的成员。我为此使用了 EraseMember 函数。但是我注意到这个函数没有释放数组成员的内存,因此泄漏了内存。
我怎样才能让rapidjson释放完整的对象及其所有成员?
RapidJSON 当前的实现使用std::vector
就像存储对象成员的数据结构一样。
在您的情况下,删除所有成员并再次添加成员本身不会造成泄漏。
然而,由于某些成员的值是数组,当它们被破坏时,它会调用分配器来释放内存。但是如果您使用默认分配器rapidjson::MemoryPoolAllocator
,它不会释放内存。这会增加每次迭代的内存使用量。
如果您需要频繁分配/取消分配值,请使用rapidjson::CrtAllocator
反而。
或者,如果这些值仅在块内使用,则可以对其进行优化,您也可以创建本地Allocator
:
char buffer[1024];
Value::Allocator localAllocator(buffer, sizeof(buffer));
while (...)
{
Value region;
region.SetArray();
region.PushBack(rectangle.m_x1, localAllocator);
// ...
localAllocator.Clear(); // Only available for MemoryPoolAllocator
}
这种“高级”用法甚至可以阻止堆分配,如果buffer
在循环中就足够了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)