附加指向QList的指针

时间:2010-07-15 10:14:13

标签: c++ qt pointers qlist

我需要将类的指针(从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);
    }
}

感谢。

4 个答案:

答案 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中,而不必担心内存泄漏悬空指针。