解析C++对象在堆栈区的析构

开发 后端
本文介绍的是C++对象在堆栈区的析构是怎么完成的,希望对你有帮助,一起来看。

关于堆栈区和析构函数,我想大家都已经很熟悉了。下面介绍的是C++对象在堆栈区的析构。

作为一个C++程序员,区别于其他面向对象语言其中最敏感的就是对new(malloc)和delete(free)这两个关键字了。

今天在阅读老大的代码的时候,在COM对象的重复赋值的时候发现在对一个vector重新分配的insert新元素的时候,没有先clear掉。自己以前在用STL的容器的时候总是在开头和***调用clear,但是进过实验和调试之后发现,含有vector的对象在析构的时候就是不做vector.clear()的话,vector中的元素也能析构。

后来稍微一想,就发现自己之前的想法是多愚蠢,STL的容器都是C++对象,既然是对象肯定会在自己的析构函数中做一些清理,如果连这些都没有的话,那STL也不会发展成C++***的一个库了。

由此又想到了很多,vector在clear到底干了什么,从汇编的角度来说,在栈上的一切变量都是不会导致内存泄露的,那么vector是否真的不用去调用clear呢?错,vector的元素肯定不会是建立在栈上的,而是建立在堆上的。为什么,建立在栈上的数组大小肯定是在编译时候就确定的,为什么?想到了在学校时候的一个非常典型的例子:

 

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

 

试图通过输入一个数字来分配对象的x个字符,这是不行的,为什么?当时老师只说这是在编译时期确定的,不能动态确定,只能写成

 

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

 

这已经是分配在堆上了,以后再运行期动态确定。那到底为什么栈上的空间不能在运行期动态确定呢?从汇编的角度来理解就容易多了:栈上能够移动的元素总是在栈顶的,无非就是Push,Pop

 

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

 

试想一下,面对这样的动态分配,该怎样生成指令来制定栈的建立呢,由于在建立栈的时候每一个指令在栈中需要占用的大小,堆中就不一样了,堆中内存可以是不连续的,不用遵循FILO的栈原则,所以是相当灵活的。

现在来看为什么STL的容器都是建立在堆上的,STL的容器往往都是可以调整大小的,试问建立在栈上的元素,如何能保证它在任何时候都能调整大小呢,除非在任何时候都能保证它在栈顶,显然这是不现实的!

 

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

【编辑推荐】

  1. C++和Java 的缺省初始化问题
  2. 谈C#与C++在静态构造函数上的区别
  3. C++程序中可以命名的5种元素
  4. C++中的指针用法汇集
  5. C++连接mysql数据库的两种方法
责任编辑:于铁 来源: CSDN博客
相关推荐

2024-12-11 16:00:00

C++函数编译器

2011-07-15 01:29:39

C++析构函数

2010-02-04 16:39:26

C++析构函数

2010-01-18 15:53:27

C++析构函数

2010-02-05 13:35:19

C++虚析构函数

2024-12-19 14:42:15

C++内存泄漏内存管理

2010-01-27 16:05:06

C++堆栈

2009-09-02 10:49:46

C#调用析构方法

2009-08-14 17:24:28

C#构造函数和析构函数

2009-07-30 15:24:13

C#析构函数C#构造函数

2009-09-03 13:14:55

C#构造函数C#析构函数

2010-01-14 09:27:44

C++语言

2023-10-11 14:18:40

C#.Net析构

2024-01-03 13:38:00

C++面向对象编程OOP

2009-11-24 16:18:14

PHP5析构函数

2021-12-11 19:02:03

函数C++对象

2010-01-20 14:25:56

函数调用

2010-10-25 10:05:03

ibmdwLinux

2011-04-11 09:43:25

C++C

2010-01-25 14:10:21

C++堆栈
点赞
收藏

51CTO技术栈公众号