在你的函数中,m_lsControlData
是通过 值传递 的方式传入的,这意味着你在函数内部对 m_lsControlData
的修改(比如 append
)不会影响外部的原始列表。
问题原因
参数是值传递:
void readXmlRuleFile(const QString &filePath, QList<xmlData*> m_lsControlData)
这里
m_lsControlData
是一个局部变量,它的修改不会影响调用方的数据。内存泄漏风险:
你在循环内new xmlData()
,但没有在外部释放这些内存,可能会导致内存泄漏。
解决方案
(1) 使用引用传递(推荐)
void readXmlRuleFile(const QString &filePath, QList<xmlData*> &m_lsControlData)
// 注意这里的 & ↑↑↑↑↑↑↑↑
这样函数内部的修改会直接影响外部的列表。
(2) 使用指针传递
void readXmlRuleFile(const QString &filePath, QList<xmlData*> *m_lsControlData)
调用时:
QList<xmlData*> lsControlData;
readXmlRuleFile("path.xml", &lsControlData);
(3) 返回值方式(适合较小的数据)
QList<xmlData*> readXmlRuleFile(const QString &filePath)
{
QList<xmlData*> m_lsControlData;
// ...解析XML并填充数据...
return m_lsControlData;
}
改进后的代码示例(引用传递 + 避免内存泄漏)
void readXmlRuleFile(const QString &filePath, QList<xmlData*> &m_lsControlData) {
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qWarning() << "Failed to open file:" << filePath;
return;
}
QDomDocument doc;
if (!doc.setContent(&file)) {
qWarning() << "Failed to parse XML file";
file.close();
return;
}
file.close();
QDomElement root = doc.documentElement();
// 读取Ports节点
QDomNodeList portsList = root.elementsByTagName("Ports");
for (int i = 0; i < portsList.size(); ++i) {
QDomNode portNode = portsList.at(i);
QDomElement portElem = portNode.firstChildElement("XmlPortRule");
while (!portElem.isNull()) {
QString uuid = portElem.firstChildElement("uuid").text();
QString hostName = portElem.firstChildElement("HostName").text();
QString port = portElem.firstChildElement("Port").text();
QString isFixed = portElem.firstChildElement("isFixed").text();
QString isWhiteTableFlag = portElem.firstChildElement("isWhiteTableFlag").text();
xmlData* data = new xmlData(); // ⚠️注意:确保外部有释放逻辑!
data->uuid = uuid;
data->HostName = hostName;
data->Port = port;
data->isFixed = isFixed;
data->isWhiteTableFlag = isWhiteTableFlag;
data->type = 0;
m_lsControlData.append(data); // ✅现在会影响外部列表
qDebug() << "[Port Rule] UUID:" << uuid<< "Host:" << hostName
<< "Port:" << port << "Fixed:" << isFixed
<< "Whitelist:" << isWhiteTableFlag;
portElem = portElem.nextSiblingElement("XmlPortRule");
}
}
}
额外建议
- 管理内存:由于你使用了
new
,确保在不再需要QList<xmlData*>
时手动释放内存:for (auto* data : m_lsControlData) { delete data; // 防止内存泄漏! }
- 考虑智能指针:如果可能,改用
QSharedPointer<xmlData>
/std::shared_ptr<xmlData>
,避免手动管理内存。
这样修改后,你的函数就能正确返回解析后的数据了! 🚀
内容由零声教学AI助手提供,问题来源于学员提问