C 上機例項之vector記憶體分配

2021-07-22 02:08:54 字數 1732 閱讀 3403

employee.h

#include

#include

using

namespace

std;

class employee

; employee(string name,string address,string code,float wage);

void change_name(string new_name);

void display();

float get_wage();

void set_wage(float wage);

};

employee.cpp

#include"employee.h"

#include

using

namespace

std;

employee::employee(string name,string address,string code,float wage)

void employee::change_name(string new_name)

{ this->name=new_name;

cout

<<" 姓名已更改 "

{ cout

<<" 姓名 :"

<<" 位址 :"

<<" 郵編 :"

<<" 工資 :"

《我使用 new 分配了乙個大小為 3 的 employee 陣列,在 vector 中通過 pushback() em1,em2,em3 ,向其中新增了 3 個元素。

結果如下:

首先分析一下建構函式和析構函式:

最前面 3 個無參建構函式是 new employee[3] 動態分配記憶體時呼叫的;

在宣告 vector : vector emvec 這個時候還沒有分配記憶體,此時,如果呼叫 size() 和 capacity() 可以看到 vector 的這兩個值都為 0 ;

接下來的三個無參建構函式是宣告三個 employee 呼叫的,好理解;

使用 pushback() 將第乙個 employee 加入 vector ,可以看到此時呼叫了拷貝建構函式,原因是呼叫 pushback() 時會給 vecotr 分配乙個記憶體空間,再將 em1 拷貝到這個記憶體;

第二次呼叫 pushback() ,可以看到這時有呼叫了一次拷貝建構函式,一次析構函式再加一次拷貝建構函式,這時為什麼呢?

來看一下 vector 的記憶體分配機制:我們知道 vector 可以使用下標來訪問相應元素,那就說明 vector 容器中的元素是連續存放的。為了滿足這一特性,在每次呼叫 pushback 都需要重新分配記憶體,把 vector 中已有的元素拷貝到新的記憶體中,將舊記憶體釋放掉,再把本次 pushback 的元素拷貝到新記憶體裡。

所以分析可知,在第二次呼叫 pushback 時,是為 vector 重新分配了兩個記憶體空間,首先將 employee1 拷貝到新記憶體,就有了一次拷貝建構函式;再將舊記憶體釋放掉,有了一次析構函式;最後將 employee2 拷貝到新的記憶體,又呼叫了一次拷貝建構函式。

第三次呼叫 pushback() 時呼叫了兩次拷貝建構函式,兩次析構函式,一次拷貝建構函式,這就不難理解了。 程式執行結束後有 9 個析構函式,分別是析構之前 new 產生的 3 個 employee 和定義的 3 個 em1 , em2 , em3 ,以及 vector 中的 3 個。注意,通過 new 分配的記憶體一定要使用 delete 釋放掉!

C 中vector記憶體擴充機制

為了支援隨機訪問,vector中的元素採用順序存放,即每乙個元素緊挨著前乙個元素進行儲存。那麼現在只有可能出現問題了,當記憶體中沒有足夠連續的空間去存放新插入來的元素怎麼辦,c 是這樣處理的 重新分配記憶體空間,將原來舊的元素全部複製到新的儲存空間中去,然後再插入新的元素。因此可以看出,如果記憶體不...

C 中vector的用法例項解析

一 概述 vector是c 標準模板庫中的部分內容,它是乙個多功能的,能夠操作多種資料結構和演算法的模板類和函式庫。vector是乙個容器,它能夠存放各種型別的物件,簡單地說,vector是乙個能夠存放任意型別的動態陣列,可以動態改變大小。例如 c語言風格 int myhouse 100 採用vec...

C 模板庫之Vector

vector支援隨機訪問,所以只要你知道元素的位置,你就可以在常量時間裡訪問任何乙個元素。如果是在末端新增或者刪除元素,那麼它的效果是非常好的,但是如何是在前端或者中段新增或刪除元素,那麼它的效率就不怎麼樣了。vector的容量是至關重要的,因為一旦重新分配記憶體,vector元素相關的refere...