警告从结构的 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
删除列表中的项目。
我正在编写具有以下类型的 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
删除列表中的项目。