我正在使用rapidjson C++ library,您可以使用此库创建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发布包含所有成员的完整对象?
答案 0 :(得分:4)
RapidJSON的当前实现使用类似$client = $mysqliDB1->query("SELECT client FROM appointments WHERE ID = $results")
->fetch_object();
$locn = $mysqliDB2->query("SELECT state,zipcode
FROM location
WHERE ClientID = {$client->FirstName}")
->fetch_object();
echo $locn->state;
echo $locn->zipcode;
的数据结构来存储对象的成员。
在您的情况下,删除所有成员并再次添加成员,本身不会泄漏。
但是,由于成员的某些值是数组,因此当它们被破坏时,它将调用分配器来释放内存。但是,如果您使用的是默认分配器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
}
在循环中足够,这种“高级”用法甚至可以防止堆分配。