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

Qt平台下Protobuf的descriptor.field_count()返回值异常原因排查

Qt中Protobuf Descriptor字段计数异常问题

代码背景

在Qt平台使用Protobuf,定义两个槽函数及哈希表:

// 函数A:加载按钮点击槽函数
void MainWindow::pushButton_load_clicked();
// 函数B:列表项点击槽函数
void MainWindow::listWidget_LBM_itemClicked(QListWidgetItem *item);
// 存储Message指针的哈希表
QHash<QString, const Message*> dic;

函数A逻辑:存储Message指针到哈希表

for (auto message_ptr : res)
{
   // ... 其他业务逻辑
   dic[funcid] = message_ptr;
}

函数B逻辑:取出指针并获取字段数量

// ... 其他业务逻辑
if(dic.find(funcid) == dic.end())
{
   qDebug() << "funcid " << funcid << " does not exist in dic" << endl;
   return;
}
const Message* message_ptr = dic[funcid];
const Descriptor* desc = message_ptr->GetDescriptor();
qDebug() << "funcid is : " << funcid << "desc->field_count() : " << desc->field_count() << endl;

问题现象

多次调用函数B时,desc->field_count()返回异常结果:

funcid is :  "30001" desc->field_count() :  0 
funcid is :  "30007" desc->field_count() :  6881390 

正确结果应为16和5。

测试验证

为定位问题,测试函数A和B中同一Message及对应Descriptor的一致性:

测试代码

// 类成员/全局变量
const Message* m1,m2,m3;
const Descriptor* d1,*d2,*d3;
int cnt = 0;
int f1, f2, f3;

// 函数A中新增测试逻辑
dic[funcid] = message_ptr;
if(cnt == 0)
{
     m1 = message_ptr;
     d1 = m1->GetDescriptor();
     f1 = d1->field_count();
     ++cnt;
}
else if(cnt == 1)
{
     m2 = message_ptr;
     d2 = m2->GetDescriptor();
     f2 = d2->field_count();
     ++cnt;
}
else
{
     m3 = message_ptr;
     d3 = m3->GetDescriptor();
     f3 = d3->field_count();
}

// 函数B中新增测试逻辑
const Message * message_ptr = dic[funcid];
if(funcid == "30007")
{
    auto d = message_ptr->GetDescriptor();
    if(message_ptr == m1)
        qDebug() << "equals m1" << endl;
    else
        qDebug() << "not equals m1" << endl;
    if(d == d1)
        qDebug() << "equals d1" << endl;
    else
        qDebug() << "not equals d1" << endl;
    if(d->field_count() == f1)
        qDebug() << "equals f1" << endl;
    else
        qDebug() << "not equals f1" << endl;
}
else if(funcid == "30001")
{
    auto d = message_ptr->GetDescriptor();
    if(message_ptr == m2)
        qDebug() << "equals m2" << endl;
    else
        qDebug() << "not equals m2" << endl;
    if(message_ptr->GetDescriptor() == d2)
        qDebug() << "equals d2" << endl;
    else
        qDebug() << "not equals d2" << endl;
    if(d->field_count() == f2)
        qDebug() << "equals f2" << endl;
    else
        qDebug() << "not equals f2" << endl;
}
else
{
    auto d = message_ptr->GetDescriptor();
    if(message_ptr == m3)
        qDebug() << "equals m3" << endl;
    else
        qDebug() << "not equals m3" << endl;
    if(message_ptr->GetDescriptor() == d3)
        qDebug() << "equals d3" << endl;
    else
        qDebug() << "not equals d3" << endl;
    if(d->field_count() == f3)
        qDebug() << "equals f3" << endl;
    else
        qDebug() << "not equals f3" << endl;
}

测试输出

equals m1 
equals d1 
not equals f1 

equals m2 
equals d2 
not equals f2 

equals m3 
equals d3 
equals f3 

疑问

Message指针和Descriptor指针均与函数A中一致,但前两个实例的字段计数结果异常,第三个实例却正常。请问导致该问题的原因是什么?期望在函数B中能获取descriptor->field_count()的正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:35:05