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

C++ 警告:从结构的QList中删除动态创建的结构,c++,qt,dynamic,struct,heap,C++,Qt,Dynamic,Struct,Heap,我正在用以下类型编写q Qt5/C++程序: struct SSensorScore { Types::EScoreComparisons comparisonType; ESensorValueTypes comparisonValueType; QVariant comparisonValue; }; typedef QList<SSensorScore> TSensorScoreList; TSensorScoreList scoreList; 我这样

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

struct SSensorScore {
    Types::EScoreComparisons comparisonType;
    ESensorValueTypes comparisonValueType;
    QVariant comparisonValue;
};
typedef QList<SSensorScore> TSensorScoreList;
TSensorScoreList scoreList;
我这样移除它们:

foreach (Types::SSensorScore score, scoreList) delete &score;
这样做有什么不对吗?在编译最后一行(删除结构)时,我遇到了一个错误:“分数的地址永远不会为空”。那又怎么样?我一定是错过了警告的要点


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

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

scoreList.append(*newScore);
此行将复制
*新闻核心
,然后将其附加到
记分表
。因此,您将泄漏
新闻核心

这一行:

foreach (Types::SSensorScore score, scoreList) 
  delete &score;
它将删除对象的副本,因此其行为不明确

并制作一个容器的副本。所以即使你解决了第一个问题,它也不会删除任何东西

只需将代码更改为:

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

您不必使用foreach
foreach

来删除列表中的项目,因为您已经把一切都搞糟了:指针、变量等等。简单的回答应该是“使用
QSharedPointer
,您不需要手动删除指针。”。是否需要存储对象或指针?决定并这样做,而不是…似乎毫无预警地编译。但这不意味着scoreList是指向结构的指针的QList吗?(事实并非如此-它是一个结构的QList)如果没有任何警告,代码不可能是非常糟糕的。根据我在这里看到的,您可以简单地使用没有指针的对象。为什么需要指针?那么您是说append函数在将对象附加到列表之前创建对象的副本?(我没有注意到在DOCS),你怎么建议我删除我的分数项目呢?@ EngsDeStices文档假设你知道C++语义。若要删除,只需使用适当的删除功能,一旦它在列表中,列表将在需要时删除对象谢谢解释-让我的头脑围绕这个问题。.clear()方法现在可以满足我的需要,不必担心内存泄漏。
SSensorScore newScore;
newScore.comparisonType = comparisonType;
newScore.comparisonValueType = Types::ESensorValueTypeUnknown;
newScore.comparisonValue = QVariant(config_score);
scoreList.append(newScore);