【问题标题】:rapidjson c++ deallocate Array within Objectrapidjson c++ 释放对象内的数组
【发布时间】:2015-09-09 01:10:06
【问题描述】:

我正在使用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 释放包含所有成员的完整对象?

【问题讨论】:

    标签: c++ arrays memory rapidjson


    【解决方案1】:

    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 足够,这种“高级”用法甚至可以阻止堆分配。

    【讨论】:

    • 我有同样的问题。这太可怕了,导致我们在线生产失败。我希望它可以更好地记录下来。 :-)
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多