在各种容器中存放的类型,必须有默认的构造函数,拷贝构造函数和赋值操作。由于QObject及所有继承自它的子类都没有提供拷贝构造和赋值操作,当我们使用QList时,编译器就会报错。
// 测试对象(也可以不继承QObject)
class TestObj : public QObject
{
Q_OBJECT
public:
explicit TestObj(QObject *parent = );
~TestObj();
TestObj(const TestObj& obj);
TestObj& operator=(const TestObj& obj);
};
1.在栈上创建对象,然后添加容器,对象加入到容器时会发生拷贝,容器析构时,容器内的对象也会析构。
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{
{
TestObj obj;
{
QList<TestObj> objList;
objList.append(obj);
}
qDebug()<<"ONE: "<<"objList release.";
}
qDebug()<<"ONE: "<<"TestObj release.";
qDebug()<<endl;
}
return a.exec();
}
2.在堆上创建对象,然后添加到容器,对象不会发生拷贝,但容器析构后容器内的对象并未析构。
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{
// test tow
{
TestObj *obj = new TestObj;
{
QList<TestObj*> objList;
objList.append(obj);
}
qDebug()<<"TWO: "<<"objList release.";
}
qDebug()<<"TWO: "<<"TestObj release? NO!";
qDebug()<<endl;
}
return a.exec();
}
总结,使用容器类存储对象时,最好使用对象指针类型,如:QList<TestObj*>,而不要使用 QList<TestObj> 这样的定义。建议采用 智能指针QSharedPointer 或 为对象设置parent 的方法来管理内存,避免内存泄露。