rapidjson c++在Object中解除分配数组

rapidjson c++ deallocate Array within Object

本文关键字:解除分配 数组 Object c++ rapidjson      更新时间:2023-10-16

我使用的是rapidjson C++库,有了这个库,您可以创建一个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来释放包含所有it成员的完整对象?

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在循环中足够,这种"高级"使用甚至可以阻止堆分配。