8

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

4 回答 4

5

如果您在“//处理错误”情况下处理“obj”(已分配但未初始化的实例),您的代码就可以了。

于 2010-07-15T10:18:28.360 回答
4

请改用 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)));
于 2017-05-17T17:34:54.600 回答
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
}
于 2010-07-15T10:16:09.613 回答
0

您可以使用QScopedPointer ..

从 Qt 4.6 文档中,

QScopedPointer 类存储一个指向动态分配对象的指针,并在销毁时将其删除。手动管理堆分配的对象既困难又容易出错,常见的结果是代码泄漏内存并且难以维护。QScopedPointer 是一个小型实用程序类,它通过将基于堆栈的内存所有权分配给堆分配来大大简化了这一点,更普遍地称为资源获取是初始化(RAII)

希望能帮助到你..

编辑:

例如,

你会用,

QScopedPointer<QWidget> p(new QWidget());

代替

QWidget *p = new QWidget();

并将其添加QScopedPointer到您的QList而不用担心内存泄漏悬空指针。

于 2010-07-15T11:26:23.487 回答