繁体   English   中英

附加指向QList的指针

[英]Appending pointers to 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);
    }
}

谢谢。

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

请改用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)));

使用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
}

你可以使用QScopedPointer ..

从Qt 4.6文档中,

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

希望能帮助到你..

编辑:

例如,

你会用的,

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

代替

QWidget *p = new QWidget();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM