Rapidjson C++ 释放对象内的数组

2024-01-17

我正在使用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(使用前将#替换为@)

Rapidjson C++ 释放对象内的数组 的相关文章

随机推荐

  • 在 C++ 中声明基于函数参数的本地数组是合法的

    我从一本书中读到 以下 C 代码不应编译 void f int n int m int a n b n m 因为数组的大小不是在编译时确定的 但我尝试了一下 发现无论是全局函数还是成员函数 使用g 都可以编译成功 这在最近的 C 实现中是合
  • 如何从Java代码生成UML图(尤其是序列图)?

    如何从现有的 Java 代码生成 UML 图 尤其是序列图 ObjectAid UML 资源管理器 http www objectaid com home 是我用过的 这很容易已安装 https www objectaid com inst
  • C# 线程池限制线程数

    好吧 我已经对该网站进行了公平的搜索 并阅读了许多有关该主题的帖子 我发现这个问题 C 中的简单线程池代码 https stackoverflow com questions 435668 code for a simple thread
  • Python - 如何使用 ioctl 或 spidev 从设备读取输入?

    我有一个提供它的供应商提供了一些 C 代码来监听按钮按下 该代码使用ioctl 该设备具有 SSD1289 控制器 按钮不需要额外的引脚 可以通过 SPI 读取其状态 这就是我想要的 读取按下了哪个按钮 我试图在 Python 中为我自己的
  • SCONS 运行目标

    我一直在寻找 寻找 但找不到我的问题的答案 我今晚刚刚开始学习 scons 看起来棒极了 不过我遇到了一点困惑 为了便于开发 我经常喜欢让我的 make 文件构建我的目标 然后运行它 以便我可以通过一次按键来测试更改 这在 make 文件中
  • Qt,没有这样的槽

    为什么我会得到这个 Object connect No such slot Ide on action Exit triggered index Object connect sender name actionClose Project
  • setTextIsSelectable 如何防止键盘出现?

    如果我使用包含单个 EditText 的单个 Activity 创建一个简单的应用程序 并且我这样做 EditText editText EditText findViewById R id editText editText setTex
  • 禁用帆中的用户挂钩

    我正在 Heroku 上托管的一个项目中使用 sails 我有一个运行 sails Web 服务器的 Web 进程和一个使用与 Web 服务器使用的模型相同的模型的工作进程 为了使其成为可能 我有不同的方式使用相同的代码启动每个进程 app
  • Python 3.3 - 连接 Oracle 数据库

    python 3 3有连接Oracle数据库的模块吗 哪个最容易使用 像 mysql 模块之类的东西只能与 Oracle 一起使用 最好是 10g 版本 但 11g 也可以 有 cx Oracle Install gt You should
  • Java 内存模型:创建最终实例字段的循环引用图(所有字段均在同一线程内分配)是否安全?

    比我更了解 Java 内存模型的人可以确认我对以下代码正确同步的理解吗 class Foo private final Bar bar Foo this bar new Bar this class Bar private final Fo
  • Powershell函数递归获取元数据

    我正在修改一些 powershell 代码 我发现这些代码可以递归地从文件中获取元数据 但我在访问文件夹中的文件夹时遇到问题 我从 share 下直接列出的文件夹中获取元数据 而不是从那里的文件夹和文件中获取元数据 如何将此代码修改为文件夹
  • 为什么 notebook() 对 IJulia 不起作用?

    我在尝试使用时收到此问题notebook 在 Julia 命令行界面 REPL 中 julia gt using IJulia Info Precompiling IJulia 7073ff75 c697 5162 941a fcdaad2
  • 如何在没有太多引号的情况下序列化 JsonObject?

    我正在 com google gson JsonObject 上编写一个小型流畅的包装器 当我序列化 Json 时 我得到 key1 value1 key2 value2 key3 innerKey value3 如何去掉多余的引号 My
  • Microsoft Translator Text API 打破了 notranslate 跨度

    我正在使用 Microsoft Translator Text API 来翻译一些句子 我的句子包含一些我不需要翻译的文本部分 为了实现这一点 我使用 span class notranslate span 通过包装不可翻译的文本 在大多数
  • iOS 使用 AVAssetWriter 捕获视频时如何正确处理方向

    我正在制作一个利用 AVFoundation 录制视频的示例应用程序 重点是这样我可以更好地控制视频的录制方式 在我的示例项目中 我进行了视频捕获 但在正确处理方向方面遇到了困难 我在网络上进行了大量搜索 发现其他人建议我不应允许我的捕获视
  • long.Parse() C#

    在 C 中 如何将字符串 例如 100 100 转换为 long 我目前有一行代码是 long xi long Parse x System Globalization NumberStyles AllowThousands 但当 x 是
  • const 引用右值的类数据成员的生命周期是多少?

    一般来说 这个讨论仅取决于局部函数变量 void foo const int i use i till foo ends foo 3 但是 这条规则是否适用于class会员还 struct A const int a A a 3 versi
  • 实现 StickyGridHeaders Android 时标题中的按钮

    我正在尝试使用粘性网格标题 https github com TonicArtos StickyGridHeaders在我的 Android 应用程序中 它工作得很好 除非我尝试将点击监听器添加到 headerview 中的可点击 Imag
  • 使用 Eclipse 在 Android 虚拟机中启动 Android java 项目时出现问题

    我已经安装并设置了 Eclipse 和插件 ADT 以便与 Android SDK 一起使用 到目前为止 一切都很好 但是 当我尝试为我选择的任何 android 平台 例如 android 3 2 启动 VM 虚拟机 时 我只是将皮肤与键
  • Rapidjson C++ 释放对象内的数组

    我正在使用rapidjson C 库 https github com miloyip rapidjson 使用此库您可以创建 JSON 对象 目前我有一些记忆问题 情况 在我当前的设置中 我创建了一个新对象 并向其添加了值成员和数组成员