我正在编写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更改为指针列表?我是否需要投射我的分数以便删除知道它是动态创建的?
答案 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
删除列表项目。