【问题标题】:clean correctly a QVector正确清理 QVector
【发布时间】:2020-10-27 17:01:31
【问题描述】:

我有一个QVector

QVector<const ClassA*> list; 

我想知道在这种情况下清理QVector 的最佳方法是什么。

ClassA 不是QObject

【问题讨论】:

  • 您是否使用new 创建这些指针?如果是这样,我建议您查看 std::unique_ptrstd::shared_ptr 或他们的 Qt 对应项。
  • 取决于你所说的干净是什么意思
  • 最好的方法是使用中定义的Qt算法qDeleteAll()。它仅适用于所有向量元素的delete。如果有必要,您需要致电QVector::clear()。如果要销毁矢量对象,则仅qDeleteAll() 就足够了

标签: c++ qt qvector


【解决方案1】:

这里有两行代码:

while (list.count())
     delete list.takeLast();

【讨论】:

    【解决方案2】:

    查看QVector.clear() 的文档 - 我认为它很好地回答了您的问题。

    为了保存,我复制到这里:

    void QVector::clear()

    从向量中删除所有元素。

    注意:直到 Qt 5.6,这也释放了向量使用的内存。从 Qt 5.7 开始,容量得以保留。要减少所有容量,请使用默认构造的向量进行交换:

    QVector<T> v ...;
    QVector<T>().swap(v);
    Q_ASSERT(v.capacity() == 0);
    

    或致电squeeze()

    【讨论】:

    • 在这种情况下 clear() 仅从向量中释放指针列表,但由于指针是手动保留的,因此不会释放内存。我尝试为 (int index = 0; index (mList[index ]);删除值; }
    【解决方案3】:

    我会写:

    qDeleteAll(list);
    list.clear();
    

    我也建议你阅读这篇文章(因为你可能会从中得到一些有趣的东西):Does C++11 allow vector<const T>?


    编辑(发布后几秒钟):我向 Pie_Jesu 道歉,他对这个问题发表了(非常)类似的评论,我在写这个答案时没有阅读。

    【讨论】:

      【解决方案4】:

      我会简单地建议使用 for each 循环并删除每个指针。之后清除向量

      for(auto item : list){
          delete item;
      }
      list.clear();
      

      或者只是在你的list 中使用classAQScopedPointer 元素,然后调用clear().

      【讨论】:

      • 如果 QVoctor 包含 ClassA QVector 的指针,则可以工作,但在我的情况下,QVector 包含 ClassA 的 const。
      【解决方案5】:

      在这种情况下 clear() 仅从向量中释放指针列表,但不会释放内存。

      我尝试做类似的事情

      for (int index = 0; index < mList.count(); ++index )
      {
          const ClassA* value = const_cast<ClassA*>(mList[index ]);
          delete value ;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        • 2021-04-23
        • 2018-06-19
        相关资源
        最近更新 更多