“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第3篇文章, 点击查看活动详情

在使用QList时,需要进行删除某一项的操作,发现QList提供了两个移除的方法,一个是removeAt(),一个是takeAt()。我创建的是一个存放指针变量的QList,需要实现两个功能,一个是移除并销毁item,一个是移除但是不销毁item。在选择这两个方法时就产生了疑问。于是查阅了官方帮助和网上资料做对比,总结一下这两个方法的区别。

  • removeAt(i): 删除索引位置i的项。i必须是列表中有效的索引位置(即0 <= i < size())。
  • takeAt(i): 移除位于索引位置i的项并返回它。i必须是列表中有效的索引位置(即0 <= I < size())。如果不使用返回值,removeAt()更合适。
  • 这里说明两个方法都是移除QList某一项的方法,不同的地方在于,removeAt()没有返回值,而takeAt()会返回移除的项的值。

    用一个简单的例子说明一下这两个方法的区别:

    QList<int> list;
    list << 1 << 2 << 3;
    //removeAt
    list.removeAt(0);
    qDebug() << list; //结果:2,3
    //takeAt
    int i = list.takeAt(0)
    qDebug() << i; //结果:1
    qDebug() << list; //结果:2,3
    

    这两个方法都移除了列表的第一项,不同的是,takeAt方法可以返回移除项的值。

    当QList中的类型为指针类型时(即每一项存入的都是一个动态创建的内存的指针),移除某一项时的操作:

    如果QList为指向T类型项的指针数组,那么QList将项直接存储在指针数组中。

    QList只保存你传入的基本指针,而不去或者不能知道这些指针是被怎么创建的,在何处创建的。所以在移除一个指针项时,只是将这个指针从列表中移出,而指针所指向的内存并没有被释放。如果需要释放,那么需要自己手动进行释放。

    QList<MyClass *> list;
    for(int i=0; i<3; i++)
        MyClass *myclass = new MyClass(this);
        list.append(myclass);
    //removeAt
    removeAt(0); // 移除第0项存放的指针地址, 指针指向的内存没有被释放
    //takeAt
    MyClass * item = takeAt(0); //移除第0项,并释放该指针指向的内存
    delete item;
    item = nullptr;
    

    这两个方法都不能实现移除但是不销毁item,我们需要重新创建一个相同的item进行保存。

    分类:
    后端
    标签: