我需要将类的指针(从QObject继承)插入到QList中。我知道可以使用以下语法:
·H
QList<MyObject*> list;
的.cpp
list.append(new MyObject("first", 1));
list.append(new MyObject("second", 2));
...
然后释放内存:
if(!list.isEmpty())
{
qDeleteAll(list);
list.clear();
}
这应该是有效的,不会导致任何内存泄漏(据我所知)。但是,我需要在将对象添加到集合之前初始化对象。以下代码段是否会导致内存泄漏或悬空指针等错误(我将使用相同的方法删除上面的指针)?
MyObject *obj;
for(i = 0; i < 5; i++)
{
obj = new MyObject();
if(!obj.Init(i, map.values(i)))
{
// handle error
}
else
{
list.append(obj);
}
}
感谢。
答案 0 :(得分:5)
如果您在“// handle error”的情况下处理“obj”(已分配但未初始化的实例),则代码正常。
答案 1 :(得分:3)
请改用QSharedPointer。
QList<QSharedPointer<MyObject> > list;
要释放记忆,你只需做
if(!list.isEmpty())
{
list.clear();
}
要附加到列表
list.append(QSharedPointer<MyObject>(new MyObject("first", 1)));
list.append(QSharedPointer<MyObject>(new MyObject("second", 2)));
答案 2 :(得分:0)
使用RAII(资源分配是初始化)。直接在构造函数中初始化对象。
然后代码看起来像:
for(i = 0; i < 5; i++)
{
list.append( new MyObject( i, map.values(i)));
// In case of initialization failure, throw exception from the constructor
}
答案 3 :(得分:0)
您可以使用QScopedPointer ..
从Qt 4.6文档中
QScopedPointer类存储指向动态分配对象的指针,并在销毁时删除它。 手动管理堆分配的对象很难并且容易出错,常见的结果是代码泄漏内存并且难以维护。 QScopedPointer是一个小型实用程序类,它通过将基于堆栈的内存所有权分配给堆分配来大大简化了这一点,通常称为资源获取是初始化(RAII)。
希望有所帮助......
编辑:
例如,
您将使用,
QScopedPointer<QWidget> p(new QWidget());
而不是
QWidget *p = new QWidget();
并将QScopedPointer
添加到QList
中,而不必担心内存泄漏和悬空指针。