2
typedef struct {
    char *u8_testStep;
    char *u8_functionTested;
    char *u8_testDescription;
    char *u8_expectedResponse;
    char *u8_packetTx;
    char *u8_packetRx;
    char *u8_passFail;
    char *u8_comment;
}T_testStepDetails;

为类型创建的列表T_testStepDetails:--

QList<T_testStepDetails>* testCaseStepslist = new QList<T_testStepDetails>();
QString strTemp;
T_testStepDetails *testStepMessageBuffer = new T_testStepDetails;

将内存分配给以下各项T_testStepDetails:----

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();
}

所以释放内存上述步骤足以防止内存泄漏?

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

4

3 回答 3

3

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

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

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

所以,我的建议:

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

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

于 2013-06-27T12:20:15.767 回答
2

首先,由于您使用的是 Qt,因此替换char *QString. 这使您可以摆脱char *数组内存交易。然后考虑您动态分配内存的每种情况:可能您可以只使用堆栈分配的对象。例如,

QList<T_testStepDetails>* testCaseStepslist = new QList<T_testStepDetails>();

乍一看似乎是多余的。您始终可以通过引用传递列表。您也可以append将分配的对象堆叠到列表中,不必动态创建它,然后复制。

于 2013-06-27T12:22:16.360 回答
1

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

考虑使用QByteArrayorQString代替 or char*

于 2013-06-27T11:45:44.727 回答