在你的代码中,stSendDataOnePaper *value = it.value();
可能会导致你看到的地址是相同的,因为它们指向同一个对象。以下是一些原因以及解决方案。
原因分析:
单一实例:如果你在
m_lsAnswerRet
哈希表中存储的是相同的stSendDataOnePaper
实例的多个引用(即使用相同的指针),那么打印出来的地址自然会是相同的。未创建新实例:在插入数据到哈希表时,如果总是使用同一个对象进行插入,而不是为每个键创建新的
stSendDataOnePaper
实例,那么它们指向的内存地址也会一样。
解决方案:
- 确保创建新实例:
确保在将
stSendDataOnePaper
对象插入到哈希表之前,为每个条目创建新的对象。例如:
// 创建一个新的 stSendDataOnePaper 对象
stSendDataOnePaper* answer = new stSendDataOnePaper();
// 设置属性...
// 插入到 m_lsAnswerRet 中
m_lsAnswerRet.insert(key, answer);
检查代码逻辑: 在添加元素之前,请仔细检查代码,确保对于不同的键,你正在创建和插入不同的数据实例,而不是重复使用同一个指针。
调试信息: 你可以添加更多调试信息,例如在插入数据时打印出新创建对象的地址,以便确认是否真的创建了多个独立对象。例如:
qDebug() << "Inserting object at address:" << (void*)answer;
- 智能指针:
如果管理内存变得复杂,考虑使用智能指针(如
std::shared_ptr
或std::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助手提供,问题来源于学员提问