ZBLOG

void readXmlRuleFile(const QString &filePath,QList m_lsControlData) { QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qWarning()

在你的函数中,m_lsControlData 是通过 值传递 的方式传入的,这意味着你在函数内部对 m_lsControlData 的修改(比如 append)不会影响外部的原始列表。

问题原因

  1. 参数是值传递

    void readXmlRuleFile(const QString &filePath, QList<xmlData*> m_lsControlData)
    

    这里 m_lsControlData 是一个局部变量,它的修改不会影响调用方的数据。

  2. 内存泄漏风险
    你在循环内 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助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?