rapidjson c++在Object中解除分配数组
rapidjson c++ deallocate Array within Object
我使用的是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成员的完整对象?
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
在循环中足够,这种"高级"使用甚至可以阻止堆分配。
相关文章:
- 将数组的地址分配给变量并删除
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 获取字符串的长度并将其分配给数组
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 使用递归模板动态分配的多维数组
- 如何正确填充在堆上分配的二维数组?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 在 C++ 中搜索动态分配的数组中的出现次数
- 解除分配矩形 2D 数组会根据尺寸产生错误
- C++删除数组只会解除分配第一项
- 与解除分配堆数组相关的语法混淆
- C 通过参考分配 /数组传递内存
- 程序在解除分配字符数组时崩溃
- 你怎么知道如何解除指针数组的分配
- c++中动态2d字符串数组的解除分配
- c++ 如何解除分配和删除指向对象的指针的 2D 数组
- 将分配/解除分配多维数组从 C++ 转换为 C
- 使用delete[]为一维常量的2d数组解除内存分配
- 为什么我不能将元素重新分配给使用 delete [] 解除分配的数组?
- 使用字符串或字符动态分配(数组)