1. 程式人生 > >【Qt】QVector對儲存資料的釋放

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

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++的用法,在哪裡都可以這麼用。

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

相關推薦

QtQVector儲存資料釋放

QVector對儲存資料的釋放 本文介紹使用Qt的QVector對儲存資料的釋放,包括儲存自動變數指標變數兩個方面。 一、QVector對自動變數的釋放 QVector中的內建有記憶體管理,當 QVector生命週期結束,它的解構函式會把QVector中的元

UWP使用 LiteDB 儲存資料

序言: 在 UWP 中,常見的儲存資料方式基本上就兩種。第一種方案是 UWP 框架提供的 ApplicationData Settings 這一系列的方法,適用於存放比較輕量的資料,例如存個 Boolean 型別的設定項這種是最適合不過的了。另一種方案是用 Sqlite 這種資料庫,適合存放資料量大或者結構

QTQt項目開發中遇到的問題的總結

文件夾 edi mes ring detached roc ebo 使用 detach 1. QMessageBox中文亂碼   這裏的中文亂碼是指只有QMessageBox才出現中文亂碼,其他都可以正常使用的情況。有些博客中提到使用QString::fromUtf8()函

EOS2.4 EOS資料儲存

學習自官方文件。 第一步: 新建一個資料夾 mkdir addressbook cd addressbook 第二步:建立CPP檔案 touch addressbook.cpp 第三步:合約基本框架 #include <eosiolib/eosio.hp

程式碼第5章 資料儲存

5.1.2 json import json info = { 'name': '王偉', 'gender': '難', 'birthday': '1992-10-08' } with open('512.json','w', encod

QTQT的學習:在QML中使用AJAX向某伺服器傳送請求獲取資料

(1)準備Ajax.js // GET function get(url, success, failure) { var xhr = new XMLHttpRequest; xhr.open("GET", url); xhr.onreadyst

Qt以QMap作為自定義類的靜態資料

類的公共資料有幾種儲存方式,其中一種為把資料作為一個類的靜態變數,這樣類的所有物件都可以訪問該資料,並且這個共享的資料只佔有在類的公共空間,不會因為物件的多少而增加儲存空間。 例如: sutudent.h class Student { public: stati

Qt資料型別和有用的資料操作類

除了C++提供的基本資料型別之外,Qt還提供了了對開發者而言非常有用的多種資料型別。Qt提供的資料型別分為基本資料型別和類形態的資料型別。   基本資料型別 Qt支援多個平臺,建立的應用程式需要在多種平臺上都具有相同大小的資料型別。為了能精確指定資料型別的大小,Qt提供了一

QT如何使用savestate()和restoreState()來儲存和恢復工具條,狀態列,其它檢視等的頁面佈局

如何使用savestate()和restoreState()來儲存和恢復工具條,狀態列,其它檢視等的頁面佈局 運用場景:建立一個基於QMainWindow的QT Widgets Application,然後根據需要新增選單欄、工具欄、狀態列等等;這是工具欄有很多,好多都疊在一起,經過拖拽

QTQT從零入門教程(五):影象檔案操作 [新建開啟儲存]

  前文已經講解了選單欄、工具欄、工作列的實現方法,下面我們對程式進行完善。實現功能為:為軟體新增“檔案”選單,並在下拉列表上新增”新建”、 ”開啟”、 ”儲存”、 ”另存為”、 ”關閉”,並在工具欄加上“新建”、“開啟”、“儲存”圖示。 程式碼 /

JavaJava中的資料儲存

堆,棧,靜態程式碼區(常量區) 在Java中,六個地方儲存資料: 1. 暫存器register: 最快的儲存區, 由編譯器根據需求進行分配,我們在程式中無法控制 最快的儲存區(由編譯

Spring-boot FastJsonjson資料進行解析(型別轉換)

序列化序列化就是指 把JavaBean物件轉成JSON格式的字串。將Map轉成JSON將List<Map>轉成JSON。自定義JavaBean User轉成JSON。String objJson = JSON.toJSONString(Object object)

matlabMatlab中實現資料以.mat檔案形式的儲存和讀取

1、儲存 利用save函式 save(filename)  %將當前工作區中的所有變數儲存在 MATLAB® 格式的二進位制檔案(MAT 檔案)filename 中。 save(filename,variables) %僅儲存 variables 指定的結構體陣列的變數

原創基於分散式儲存的開源系統在實時資料庫海量歷史資料儲存專案上的預研

1.  要關注的問題 2.  解決問題的傳統方法 3.  傳統方法的優化以及優化過程中問題 4.  Hadoop是什麼?Hadoop中的HDFS、MapReduce與HBase。 5  利用HBase如何解決要關注的問題 1.  要關注的問題 青島高

NodeJS開發日記(7)——JS本地儲存資料的幾種方法

【轉自https://blog.csdn.net/darrenzzb66/article/details/73012577】1.Cookie 這個恐怕是最常見也是用得最多的技術了,也是比較古老的技術了。COOKIE優點很多,使用起來很方便 但它的缺點也很多: 比如跨域訪問問題

Qt訊號和槽值傳遞引數和引用傳遞引數的總結

在同一個執行緒中 當訊號和槽都在同一個執行緒中時,值傳遞引數和引用傳遞引數有區別: 值傳遞會複製物件;(測試時,列印傳遞前後的地址不同) 引用傳遞不會複製物件;(測試時,列印傳遞前後的地址相同)

php面向象(一)

打電話 成員方法 駝峰命名 bject 內部 自動 正在 自己 div 1. 學習面向對象的目標:  a) 語法的學習:  b) 編程思想的學習:    i. 過程化:    ii. 面向對象:2. 比較(有對象和沒對象的區別)  a) 沒對象:    i. 我餓了 自己

php面向象(五)

row 操作類 面向對象 ssa getline var pre span 錯誤信息 一、 類型約束:  a) 約束函數可傳入的參數類型二、 類的遍歷  a) Foreach  b) 可以將類當中的所有成員屬性遍歷出來三、 關於操作類與對象的一些函數:  a) 判斷函數  

php面向象(三)

lamp1 變量 步驟 efi 第一個 面向對象 我們 ati 單例 知識點關鍵詞:FSCICATS一、 f => final:  a) 是一個修飾符,用來修飾類和成員方法  b) 使用final修飾符修飾的類不能被繼承,使用final修飾符修飾的成員方法,不能被重寫

原創Python 象創建過程中元類, __new__, __call__, __init__ 的處理

diff regular luci 自定義 weight ica 一般來說 att ray 原始type: type是最原始的元類,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple,