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
相关产品推荐
相关产品推荐

