You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在每次while循环中初始化RapidJSON缓冲区 解决数据包逐次变长问题

问题根因
  • 最核心的问题是**jsonDocumentDataSending对象未重置**:你在每次循环中都调用AddMember方法向这个JSON对象追加新的键值对,但从未清空该对象,导致JSON结构持续累加膨胀,直接表现为发送的报文逐次变长。
  • 消息队列操作逻辑错误:你调用push_back将消息插入队尾,读取队首元素发送后调用pop_back删除队尾元素,会导致队首消息永远残留无法删除,队列持续积压。
  • 其他潜在问题:如果pu8resbuf是指针类型,sizeof(pu8resbuf)得到的是指针本身的字节数(64位系统下为8),不是指向的数组实际长度,会导致序列化的数组内容不符合预期;刚实例化的StringBuffer本身为空,调用Clear()属于冗余操作。
所需修改
  1. 每次循环构建发送JSON前,调用SetObject()方法重置jsonDocumentDataSending为空白JSON对象
  2. 修正消息队列出队操作,发送队首元素后调用pop_front()而非pop_back()
  3. 如果pu8resbuf是动态分配的指针,替换sizeof(pu8resbuf)为实际数组长度参数
  4. 可移除冗余的bufferJson.Clear()调用
修改后参考代码
// 每轮循环开头先重置JSON文档
jsonDocumentDataSending.SetObject();

rapidjson::Value databuf(kArrayType);
// 初始化已指定kArrayType,SetArray可省略
for (size_t j = 0; j < /* 替换为pu8resbuf对应的实际数组长度 */; j++)
{   
    if(databuf.IsNull() == true)
    {
        printf("databuf is null!\n");
    }
    databuf.PushBack(Value().SetInt(pu8resbuf[j]),allocator);
}

payload.SetArray();
payload.PushBack(databuf, allocator);

auto raw_key = std::string("payload-") + std::to_string(m_count_objects/60) + "-" + std::to_string(m_count_objects);
rapidjson::Value key(raw_key, allocator);
rapidjson::StringBuffer bufferJson;

jsonDocumentDataSending.AddMember(key, payload, allocator);

rapidjson::Writer<rapidjson::StringBuffer> writer(bufferJson);
jsonDocumentDataSending.Accept(writer);

std::string stringForSending = std::string(bufferJson.GetString());
std::shared_ptr<std::string> ss(std::make_shared<std::string>(stringForSending));
messageQ.push_back(ss);

if(!messageQ.empty())
{
  ws_.write(net::buffer(*messageQ.front()));
  // 改为pop_front删除已发送的队首元素
  messageQ.pop_front();
  databuf.SetArray();
}

内容的提问来源于stack exchange,提问作者Taki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:24:04