【Qt】QVector對儲存資料的釋放

Little柯南發表於2018-01-29

QVector對儲存資料的釋放

本文介紹使用Qt的QVector對儲存資料的釋放,包括儲存自動變數指標變數兩個方面。


一、QVector對自動變數的釋放

QVector中的內建有記憶體管理,當 QVector生命週期結束,它的解構函式會把QVector中的元素銷燬,並釋放它們所佔用的空間,所以用QVector一般不用顯式釋放 。但是當QVector儲存資料相當大時候,並且對資料進行了一些操作,比如刪除後,如果我們能積極主動的去釋放記憶體,那麼是非常明智高效。
我們的操作方法是:

        m_vecItems.clear();
        QVector<Custom>().swap(m_vecItems);

這裡使用空的自定義型別的QVector來交換原向量,從而達到對QVector容量的清零。
當然如果用C++11的std::vector那麼也可以這樣釋放:

    m_vecItems.clear();
    m_vecItems.shrink_to_fit();

二、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);

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();

2)void qDeleteAll(const Container &c)
也就是可以直接清空一個容器,比如QList、QVector等。

用這些Qt自帶的函式,在本身框架裡更簡單。但是最上面的用法其實是C++的用法,在哪裡都可以這麼用。

有何不足,也歡迎批評指教!記錄只為更好的總結與分享!


相關文章