Qt qlist-避免内存泄漏

Qt qlist-避免内存泄漏,qt,qlist,Qt,Qlist,为类型T\u testStepDetails创建的列表:-- QList<T_testStepDetails>* testCaseStepslist = new QList<T_testStepDetails>(); QString strTemp; T_testStepDetails *testStepMessageBuffer = new T_testStepDetails; 在列表中附加:--- 可用内存:---- 因此,要释放内存,上述步骤足以防止内存泄漏? 或

为类型
T\u testStepDetails
创建的列表:--

QList<T_testStepDetails>* testCaseStepslist = new QList<T_testStepDetails>();
QString strTemp;
T_testStepDetails *testStepMessageBuffer = new T_testStepDetails;
在列表中附加:---

可用内存:----

因此,要释放内存,上述步骤足以防止内存泄漏


或者对于列表中类型为
T\u testStepDetails
的每个结构,我必须为动态分配内存的内部
char*
成员释放内存

您必须对使用
new[]
创建的每个
char*
调用
delete[]


考虑使用
QByteArray
QString
代替或
char*

注意,您不需要动态实例化列表,Qt容器被显式共享以供读取,甚至可以作为值传递,而不会发生深度复制。由于间接性较小,在堆栈上创建的
QList
可能会更快一些

我还注意到您使用的是普通动态分配、普通数组动态分配以及引用计数容器的组合。虽然这并没有什么特别的错误,但最好决定是为了一致性而使用低级别还是高级别构造,正如Riateche所提到的,您可以一直使用高级结构,完全避免手动内存管理,因为您没有限制不使用这些结构。。。你现在所拥有的只是混乱,即使不一定是错的

由于您存储在列表中的对象不是派生的
QObject
,因此您甚至可以将实际元素存储为指向它们的指针(
QObject
s无法复制,因此只能将指向它们的指针存储在容器中),在顺序容器中,可以最大限度地减少浪费的内存空间并获得更好的性能
QList
甚至会在所有实例“超出范围”时取消分配和销毁(如果有的话)。在当前场景中,您使用常规指针,这些指针没有析构函数,并且自然不会取消分配内存

因此,我的建议是:

  • 使用
    QString
    代替
    char*
  • 使用
    QScopedPointer
    而不是
    T*
    或仅存储实际实例(例如值)
  • 尽可能使用堆栈分配

这将内存泄漏的可能性降至最低。另外,我认为避免“指针指向结构的指针列表或指向字符的指针”的场景是很好的——表面上看,您使其变得不必要的复杂,使用更高的结构,所有这些复杂的内容都将对您隐藏,内存管理将是自动的。

首先,因为您使用的是Qt,用
QString
替换
char*
似乎是合理的。这可以让您摆脱
char*
数组内存交易。然后考虑动态分配内存的每种情况:可能只使用堆栈分配的对象。比如说,

if(!list.isEmpty())
{
    qDeleteAll(list);
    list.clear();
}
QList*testCaseStepslist=newqlist();
乍一看,这似乎是多余的。您始终可以通过引用传递列表。您还可以
分配的对象添加到列表中,不必动态创建它,然后复制

testStepMessageBuffer->u8_testStep = new char[strTemp.length()];
// copy value to the pointer
qstrcpy(testStepMessageBuffer->u8_testStep, strTemp.toStdString().c_str());
testCaseStepslist->append(*testStepMessageBuffer);
if(!list.isEmpty())
{
    qDeleteAll(list);
    list.clear();
}
QList<T_testStepDetails>* testCaseStepslist = new QList<T_testStepDetails>();