QT C++的容器类存储自定义对象的操作

    在各种容器中存放的类型,必须有默认的构造函数拷贝构造函数赋值操作。由于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 的方法来管理内存,避免内存泄露。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值