温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++对象在堆栈区的析构是怎样的

发布时间:2021-11-30 15:56:31 来源:亿速云 阅读:141 作者:iii 栏目:编程语言

这篇文章主要介绍“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的元素肯定不会是建立在栈上的,而是建立在堆上的。为什么,建立在栈上的数组大小肯定是在编译时候就确定的,为什么?想到了在学校时候的一个非常典型的例子:

int x;  scanf("%d", &x);  char ch[x];

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

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

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

char ch[x];  int i,j;

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

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

到此,关于“C++对象在堆栈区的析构是怎样的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI