ZBLOG

for (auto it = GetlsAnswerRet().constBegin(); it != GetlsAnswerRet().constEnd(); ++it) { QString key = it.key(); if(key == ipAddress) { stSendDataOnePaper *value =...

在你的代码中,stSendDataOnePaper *value = it.value(); 可能会导致你看到的地址是相同的,因为它们指向同一个对象。以下是一些原因以及解决方案。

原因分析:

  1. 单一实例:如果你在 m_lsAnswerRet 哈希表中存储的是相同的 stSendDataOnePaper 实例的多个引用(即使用相同的指针),那么打印出来的地址自然会是相同的。

  2. 未创建新实例:在插入数据到哈希表时,如果总是使用同一个对象进行插入,而不是为每个键创建新的 stSendDataOnePaper 实例,那么它们指向的内存地址也会一样。

解决方案:

  1. 确保创建新实例: 确保在将 stSendDataOnePaper 对象插入到哈希表之前,为每个条目创建新的对象。例如:
   // 创建一个新的 stSendDataOnePaper 对象
   stSendDataOnePaper* answer = new stSendDataOnePaper();
   // 设置属性...
   
   // 插入到 m_lsAnswerRet 中
   m_lsAnswerRet.insert(key, answer);
  1. 检查代码逻辑: 在添加元素之前,请仔细检查代码,确保对于不同的键,你正在创建和插入不同的数据实例,而不是重复使用同一个指针。

  2. 调试信息: 你可以添加更多调试信息,例如在插入数据时打印出新创建对象的地址,以便确认是否真的创建了多个独立对象。例如:

   qDebug() << "Inserting object at address:" << (void*)answer;
  1. 智能指针: 如果管理内存变得复杂,考虑使用智能指针(如 std::shared_ptrstd::unique_ptr),这样可以更安全地管理动态分配内存,并避免内存泄漏或多重释放的问题。

完整示例

以下是一个小示例,以说明如何正确地添加新实例并打印它们的地址:

QHash<QString, stSendDataOnePaper*> m_lsAnswerRet;

QString key = "some_unique_key";

// 创建并初始化一个新的 stSendDataOnePaper 实例
stSendDataOnePaper* newAnswer = new stSendDataOnePaper();
// 设置属性
newAnswer->subject_number = index;
// 其他属性设置...

// 将其插入到哈希表中
m_lsAnswerRet.insert(key, newAnswer);

// 打印当前所有对象的地址以验证
for (auto it = m_lsAnswerRet.constBegin(); it != m_lsAnswerRet.constEnd(); ++it) {
    qDebug() << "Address in QHash:" << (void*)it.value();
}

这样,你应该能够看到不同地址对应于不同 stSendDataOnePaper 实例。如果你仍然看到相同的地址,请再次检查你的数据处理逻辑,以确保没有重复引用。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21716

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?