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

时间:2015-01-16 16:16:01

标签: c++ qt dynamic struct heap

我正在编写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;

做上述事情有什么问题吗?在编译最后一行(删除结构)时,给出了一个错误,即“得分的地址永远不会为空”。所以呢?我必须忽略警告的重点...

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

1 个答案:

答案 0 :(得分:3)

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

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删除列表项目。