溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

關(guān)于vector容器的內(nèi)存釋放

發(fā)布時(shí)間:2020-10-12 00:43:28 來(lái)源:網(wǎng)絡(luò) 閱讀:1884 作者:q381989042 欄目:編程語(yǔ)言

以前使用vector容器一直有個(gè)誤區(qū)=。=,然后最近面試被鄙視了QWQ


先說(shuō)一下vector容器的簡(jiǎn)單原理:

  對(duì)于vector容器而言,數(shù)據(jù)結(jié)構(gòu)就是數(shù)組,在STL中我有剖析源碼。其中實(shí)現(xiàn)的是相當(dāng)于數(shù)組的方面,然后其中對(duì)于容器的操作函數(shù)都有:

 


在這之中。插入操作我們就暫且不提。就是數(shù)組的數(shù)據(jù)插入。

現(xiàn)在說(shuō)一下關(guān)于vector容器中的空間設(shè)置

 vector中有2個(gè)大小指標(biāo),一個(gè)是size:代表當(dāng)前數(shù)據(jù)的大小

            另外一個(gè)是capacity.代表著當(dāng)前vector所申請(qǐng)的空間大小


下面提一下空間配置器。對(duì)于STL所有的容器而言,都是使用STL內(nèi)部實(shí)現(xiàn)的alloc(內(nèi)存池)進(jìn)行空間的申請(qǐng)。vector是一個(gè)靜態(tài)的空間,也就是我們申請(qǐng)以后就無(wú)法進(jìn)行修改了。


以前我很蠢的直接調(diào)用clear然后就清除數(shù)據(jù)就ok了,然后空間隨著作用域進(jìn)行釋放。。


結(jié)果這樣會(huì)有很大的內(nèi)存浪費(fèi)。。


所以解決方法是這樣

//加一對(duì)大括號(hào)是可以讓tmp退出{}的時(shí)候自動(dòng)析構(gòu){ 
    std::vector<int> tmp =   nums;  
    nums.swap(tmp); 
}

通過(guò)swap函數(shù)進(jìn)行空間轉(zhuǎn)換,然后就出去作用域vector就進(jìn)行了釋放。


在標(biāo)準(zhǔn)一點(diǎn)是這樣的:

template < class T >void ClearVector( vector< T >& vt ) 
{
    vector< T > vtTemp; 
    veTemp.swap( vt );
}


就是通過(guò)作用域還有swqp的搭配進(jìn)行空間的釋放,然后就OK了


下面提一個(gè)小問(wèn)題:

如果vector中存放的是指針,那么當(dāng)vector銷毀時(shí),這些指針指向的對(duì)象不會(huì)被銷毀,那么內(nèi)存就不會(huì)被釋放。如下面這種情況,vector中的元素時(shí)由new操作動(dòng)態(tài)申請(qǐng)出來(lái)的對(duì)象指針:

for (vector<void *>::iterator it = v.begin(); it != v.end(); it ++) 
    if (NULL != *it) 
    {
        delete *it; 
        *it = NULL;
    }
v.clear();

當(dāng)時(shí)很sb的就回答成這種情況了,面壁面壁。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI