自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解析C++對(duì)象在堆棧區(qū)的析構(gòu)

開發(fā) 后端
本文介紹的是C++對(duì)象在堆棧區(qū)的析構(gòu)是怎么完成的,希望對(duì)你有幫助,一起來看。

關(guān)于堆棧區(qū)和析構(gòu)函數(shù),我想大家都已經(jīng)很熟悉了。下面介紹的是C++對(duì)象在堆棧區(qū)的析構(gòu)。

作為一個(gè)C++程序員,區(qū)別于其他面向?qū)ο笳Z(yǔ)言其中最敏感的就是對(duì)new(malloc)和delete(free)這兩個(gè)關(guān)鍵字了。

今天在閱讀老大的代碼的時(shí)候,在COM對(duì)象的重復(fù)賦值的時(shí)候發(fā)現(xiàn)在對(duì)一個(gè)vector重新分配的insert新元素的時(shí)候,沒有先clear掉。自己以前在用STL的容器的時(shí)候總是在開頭和***調(diào)用clear,但是進(jìn)過實(shí)驗(yàn)和調(diào)試之后發(fā)現(xiàn),含有vector的對(duì)象在析構(gòu)的時(shí)候就是不做vector.clear()的話,vector中的元素也能析構(gòu)。

后來稍微一想,就發(fā)現(xiàn)自己之前的想法是多愚蠢,STL的容器都是C++對(duì)象,既然是對(duì)象肯定會(huì)在自己的析構(gòu)函數(shù)中做一些清理,如果連這些都沒有的話,那STL也不會(huì)發(fā)展成C++***的一個(gè)庫(kù)了。

由此又想到了很多,vector在clear到底干了什么,從匯編的角度來說,在棧上的一切變量都是不會(huì)導(dǎo)致內(nèi)存泄露的,那么vector是否真的不用去調(diào)用clear呢?錯(cuò),vector的元素肯定不會(huì)是建立在棧上的,而是建立在堆上的。為什么,建立在棧上的數(shù)組大小肯定是在編譯時(shí)候就確定的,為什么?想到了在學(xué)校時(shí)候的一個(gè)非常典型的例子:

 

  1. int x;  
  2. scanf("%d", &x);  
  3. char ch[x]; 

 

試圖通過輸入一個(gè)數(shù)字來分配對(duì)象的x個(gè)字符,這是不行的,為什么?當(dāng)時(shí)老師只說這是在編譯時(shí)期確定的,不能動(dòng)態(tài)確定,只能寫成

 

  1. int x;  
  2. scanf("%d", &x);  
  3. char* ch = new char[x]; 

 

這已經(jīng)是分配在堆上了,以后再運(yùn)行期動(dòng)態(tài)確定。那到底為什么棧上的空間不能在運(yùn)行期動(dòng)態(tài)確定呢?從匯編的角度來理解就容易多了:棧上能夠移動(dòng)的元素總是在棧頂?shù)?,無非就是Push,Pop

 

  1. char ch[x];  
  2. int i,j; 

 

試想一下,面對(duì)這樣的動(dòng)態(tài)分配,該怎樣生成指令來制定棧的建立呢,由于在建立棧的時(shí)候每一個(gè)指令在棧中需要占用的大小,堆中就不一樣了,堆中內(nèi)存可以是不連續(xù)的,不用遵循FILO的棧原則,所以是相當(dāng)靈活的。

現(xiàn)在來看為什么STL的容器都是建立在堆上的,STL的容器往往都是可以調(diào)整大小的,試問建立在棧上的元素,如何能保證它在任何時(shí)候都能調(diào)整大小呢,除非在任何時(shí)候都能保證它在棧頂,顯然這是不現(xiàn)實(shí)的!

 

本文地址:http://blog.csdn.net/woshishenguanyear/archive/2011/06/13/6542527.aspx

【編輯推薦】

  1. C++和Java 的缺省初始化問題
  2. 談C#與C++在靜態(tài)構(gòu)造函數(shù)上的區(qū)別
  3. C++程序中可以命名的5種元素
  4. C++中的指針用法匯集
  5. C++連接mysql數(shù)據(jù)庫(kù)的兩種方法
責(zé)任編輯:于鐵 來源: CSDN博客
相關(guān)推薦

2024-12-11 16:00:00

C++函數(shù)編譯器

2025-02-18 00:08:00

代碼C++RAII

2011-07-15 01:29:39

C++析構(gòu)函數(shù)

2010-01-18 15:53:27

C++析構(gòu)函數(shù)

2010-02-04 16:39:26

C++析構(gòu)函數(shù)

2024-12-19 14:42:15

C++內(nèi)存泄漏內(nèi)存管理

2010-02-05 13:35:19

C++虛析構(gòu)函數(shù)

2010-01-27 16:05:06

C++堆棧

2009-09-02 10:49:46

C#調(diào)用析構(gòu)方法

2009-08-14 17:24:28

C#構(gòu)造函數(shù)和析構(gòu)函數(shù)

2009-07-30 15:24:13

C#析構(gòu)函數(shù)C#構(gòu)造函數(shù)

2010-01-14 09:27:44

C++語(yǔ)言

2025-04-11 07:50:00

虛析構(gòu)函數(shù)C++開發(fā)

2009-09-03 13:14:55

C#構(gòu)造函數(shù)C#析構(gòu)函數(shù)

2023-10-11 14:18:40

C#.Net析構(gòu)

2024-01-03 13:38:00

C++面向?qū)ο缶幊?/a>OOP

2009-11-24 16:18:14

PHP5析構(gòu)函數(shù)

2021-12-11 19:02:03

函數(shù)C++對(duì)象

2010-01-20 14:25:56

函數(shù)調(diào)用

2010-10-25 10:05:03

ibmdwLinux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)