Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1489|回复: 0
打印 上一主题 下一主题

QVector对存储数据的释放

[复制链接]

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
跳转到指定楼层
楼主
发表于 2020-3-10 09:19:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
文介绍使用Qt的QVector对存储数据的释放,包括存储自动变量指针变量两个方面。

一、QVector对自动变量的释放
QVector中的内建有内存管理,当 QVector生命周期结束,它的析构函数会把QVector中的元素销毁,并释放它们所占用的空间,所以用QVector一般不用显式释放 。但是当QVector存储数据相当大时候,并且对数据进行了一些操作,比如删除后,如果我们能积极主动的去释放内存,那么是非常明智高效。
我们的操作方法是:

        m_vecItems.clear();
        QVector<Custom>().swap(m_vecItems);
1
2
这里使用空的自定义类型的QVector来交换原向量,从而达到对QVector容量的清零。
当然如果用C++11的std::vector那么也可以这样释放:

    m_vecItems.clear();
    m_vecItems.shrink_to_fit();
1
2
二、QVector对指针变量的释放
如果你QVector 中存放的是指针,那么当 QVector 销毁时,那些指针指向的对象不会被销毁,那些内存不会被释放,这时需要自己来释放这些动态分配的内存,方法是:

    for(auto it = m_vecItems.begin(); it != m_vecItems.end(); ++it)
    {
        if(*it != nullptr)
        {
            delete (*it);
            (*it) = nullptr;
        }

    }
    m_vecItems.clear();
    QVector<Custom*>().swap(m_vecItems);
1
2
3
4
5
6
7
8
9
10
11
2018-10-29补充:
Qt之中,在QtAlgorithms里面有个函数,qDeleteAll,其本身有两个重载:
1)void qDeleteAll(ForwardIterator begin, ForwardIterator end)
用法如下:

  QList<Employee *> list;
  list.append(new Employee("Blackpool", "Stephen"));
  list.append(new Employee("Twist", "Oliver"));

  qDeleteAll(list.begin(), list.end());
  list.clear();
1
2
3
4
5
6
2)void qDeleteAll(const Container &c)
也就是可以直接清空一个容器,比如QList、QVector等。

用这些Qt自带的函数,在本身框架里更简单。但是最上面的用法其实是C++的用法,在哪里都可以这么用。

有何不足,也欢迎批评指教!记录只为更好的总结与分享!
————————————————
版权声明:本文为CSDN博主「Little柯南」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010111033/article/details/79191985

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-2 20:18 , Processed in 0.054813 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表