C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素
vector是一種動(dòng)態(tài)數(shù)組,在內(nèi)存中具有連續(xù)的存儲(chǔ)空間,支持快速隨機(jī)訪問。由于具有連續(xù)的存儲(chǔ)空間,所以在插入和刪除操作方面,效率比較慢。vector有多個(gè)構(gòu)造函數(shù),默認(rèn)的構(gòu)造函數(shù)是構(gòu)造一個(gè)初始長度為0的內(nèi)存空間,且分配的內(nèi)存空間是以2的倍數(shù)動(dòng)態(tài)增長的。在push_back的過程中,若發(fā)現(xiàn)分配的內(nèi)存空間不足,則重新分配一段連續(xù)的內(nèi)存空間,其大小是現(xiàn)在連續(xù)空間的2倍,再將原先空間中的元素復(fù)制到新的空間中,性能消耗比較大。
vector 基本用法:
- front()返回頭部元素的引用,可以當(dāng)左值
- back()返回尾部元素的引用,可以當(dāng)左值
- push_back()添加元素,只能尾部添加
- pop_back()移除元素,只能在尾部移除
- erase(iterator) 是根據(jù)位置進(jìn)行刪除,如果想要?jiǎng)h除某個(gè)元素,需要找到當(dāng)前元素的迭代器位置,再進(jìn)行刪除
- insert() 結(jié)合迭代器位置插入指定的元素
我們使用vector時(shí)候,有時(shí)候會(huì)插入一些動(dòng)態(tài)內(nèi)存數(shù)據(jù)(例如new出來的指針插入到vector中)。這時(shí)候我們一定要注意C++的內(nèi)存管理,因?yàn)镃++的內(nèi)存管理原則,誰申請(qǐng)的,誰銷毀。我們?nèi)绻粚?duì)vector里的指針對(duì)應(yīng)的動(dòng)態(tài)內(nèi)存進(jìn)行銷毀操作,直接clear()的話就會(huì)造成內(nèi)存泄露。所以我們需要首先遍歷vector,把vector中元素存儲(chǔ)的指針對(duì)應(yīng)動(dòng)態(tài)內(nèi)存銷毀掉,然后再clear()掉vector。
demo示例:
#include <vector>
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
vector<char *> obj;
//vector中插入動(dòng)態(tài)內(nèi)存
for(int i=0;i<10;i++)
{
char * ptr = new char[100];
memset(ptr, 0 , 100);
obj.push_back(ptr);
}
//需要清理申請(qǐng)的動(dòng)態(tài)內(nèi)存,然后才能清空vector,否則會(huì)造成內(nèi)存泄露
for(vector<char *>::iterator it = obj.begin(); it != obj.end(); it++)
{
if(*it != NULL)
{
delete *it;
*it = NULL;
}
}
obj.clear();
return 0;
}
番外篇:new char[100]和new char(100)的區(qū)別
寫demo的時(shí)候,順手寫了new char(100)。。。后面發(fā)現(xiàn)不對(duì)了。。。哎。。。所以加了個(gè)番外篇,記錄一下。
new char[100]和new char(100)的區(qū)別,其實(shí)這個(gè)屬于分配問題,大家使用時(shí)還是要注意的,失之毫厘差以千里??!
詳情如下:
char *p = new char[200]; // new一個(gè)char數(shù)組,大小為200 char *p = new char(200); //new一個(gè)char ,其初始值為200
到此這篇關(guān)于C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素的文章就介紹到這了,更多相關(guān)C++ vector動(dòng)態(tài)申請(qǐng)內(nèi)存元素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt實(shí)現(xiàn)部件透明陰影效果與不規(guī)則窗體詳解
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)部件透明陰影效果與不規(guī)則窗體的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01
OpenCV鼠標(biāo)繪制矩形和截取矩形區(qū)域圖像
這篇文章主要為大家詳細(xì)介紹了OpenCV鼠標(biāo)繪制矩形和截取矩形區(qū)域圖像,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01

