警告从结构的 QList 中删除动态创建的结构

Warning removing dynamically created structs from QList of structs

我正在编写具有以下类型的 q Qt5/C++ 程序:

struct SSensorScore {
    Types::EScoreComparisons comparisonType;
    ESensorValueTypes comparisonValueType;
    QVariant comparisonValue;
};
typedef QList<SSensorScore> TSensorScoreList;
TSensorScoreList scoreList;

我将项目附加到我的 scoreList 列表中:

SSensorScore *newScore = new Types::SSensorScore;
newScore->comparisonType = comparisonType;
newScore->comparisonValueType = Types::ESensorValueTypeUnknown;
newScore->comparisonValue = QVariant(config_score);
scoreList.append(*newScore);

然后我这样删除它们:

foreach (Types::SSensorScore score, scoreList) delete &score;

这样做有什么问题吗?编译最后一行时(删除结构)给我一个 'the address of score will never be null' 的错误。所以呢?我一定是错过了警告的要点...

也许我对如何创建动态创建的结构的 QList 感到困惑。我需要将我的 QList 更改为指针列表吗?我是否需要投射我的分数以便 delete 知道它是动态创建的?

您有内存泄漏和未定义行为! :

scoreList.append(*newScore);

此行将复制 *newScore,然后将其附加到 scoreList。所以你会泄漏 newScore.

和这一行:

foreach (Types::SSensorScore score, scoreList) 
  delete &score;

它将删除对象的副本,因此它是未定义的行为。

并且 Qt 还复制了容器 before entering foreach。所以即使你解决了第一个问题,它也不会删除任何东西!

只需将您的代码更改为:

SSensorScore newScore;
newScore.comparisonType = comparisonType;
newScore.comparisonValueType = Types::ESensorValueTypeUnknown;
newScore.comparisonValue = QVariant(config_score);
scoreList.append(newScore);

而且您不必使用 foreach 删除列表中的项目。